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

Artifact e69349b91ad7414f32484352057898e820020085:


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 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   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 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 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: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 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 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 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 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, 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 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53 68 61  .  u8 hasHeldSha
7920: 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20 20 2f  redLock;       /
7930: 2a 20 54 72 75 65 20 69 66 20 61 20 73 68 61 72  * True if a shar
7940: 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76 65 72  ed lock has ever
7950: 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a 20 20   been held */.  
7960: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
7970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7980: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7990: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
79a0: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
79b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
79c0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
79d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
79e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
79f0: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7a10: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a30: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69  e */.  Pgno dbHi
7a40: 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
7a50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73     /* Value pass
7a60: 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45  ed to FCNTL_SIZE
7a70: 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20  _HINT call */.  
7a80: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7aa0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
7ab0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
7ac0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
7af0: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
7b00: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
7b10: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
7b20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7b30: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
7b40: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
7b50: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
7b60: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
7b90: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
7ba0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7bb0: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
7bc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
7bd0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
7be0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
7bf0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66  base file */.#if
7c00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7c10: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 42 69  _CONCURRENT.  Bi
7c20: 74 76 65 63 20 2a 70 41 6c 6c 52 65 61 64 3b 20  tvec *pAllRead; 
7c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7c40: 65 73 20 72 65 61 64 20 77 69 74 68 69 6e 20 63  es read within c
7c50: 75 72 72 65 6e 74 20 43 4f 4e 43 55 52 52 45 4e  urrent CONCURREN
7c60: 54 20 74 72 61 6e 73 2e 20 2a 2f 0a 23 65 6e 64  T trans. */.#end
7c70: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  if.  sqlite3_fil
7c80: 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20 20  e *fd;          
7c90: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
7ca0: 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73 65  tor for database
7cb0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7cc0: 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
7cd0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7ce0: 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f  ptor for main jo
7cf0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74  urnal */.  sqlit
7d00: 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20  e3_file *sjfd;  
7d10: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7d20: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73 75  escriptor for su
7d30: 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  b-journal */.  i
7d40: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
7d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7d60: 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66 73  rrent write offs
7d70: 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
7d80: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
7d90: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
7da0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
7db0: 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f  offset to previo
7dc0: 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  us journal heade
7dd0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  r */.  sqlite3_b
7de0: 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20  ackup *pBackup; 
7df0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7e00: 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67   list of ongoing
7e10: 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
7e20: 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65  s */.  PagerSave
7e30: 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e  point *aSavepoin
7e40: 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61  t; /* Array of a
7e50: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
7e60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70   */.  int nSavep
7e70: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  oint;           
7e80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
7e90: 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65  lements in aSave
7ea0: 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 75 33 32  point[] */.  u32
7eb0: 20 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 20 20   iDataVersion;  
7ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e           /* Chan
7ed0: 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74  ges whenever dat
7ee0: 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 63 68  abase content ch
7ef0: 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  anges */.  char 
7f00: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
7f10: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
7f20: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
7f30: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
7f40: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d 6d 61 70   */..  int nMmap
7f50: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
7f60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7f70: 6d 6d 61 70 20 70 61 67 65 73 20 63 75 72 72 65  mmap pages curre
7f80: 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  ntly outstanding
7f90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
7fa0: 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20 20 20 20  t64 szMmap;     
7fb0: 20 20 2f 2a 20 44 65 73 69 72 65 64 20 6d 61 78    /* Desired max
7fc0: 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 2a  imum mmap size *
7fd0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d 6d 61 70  /.  PgHdr *pMmap
7fe0: 46 72 65 65 6c 69 73 74 3b 20 20 20 20 20 20 20  Freelist;       
7ff0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
8000: 6d 6d 61 70 20 70 61 67 65 20 68 65 61 64 65 72  mmap page header
8010: 73 20 28 70 44 69 72 74 79 29 20 2a 2f 0a 20 20  s (pDirty) */.  
8020: 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74  /*.  ** End of t
8030: 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61  he routinely-cha
8040: 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62  nging class memb
8050: 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ers.  **********
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80a0: 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61  */..  u16 nExtra
80b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
80c0: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
80d0: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
80e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
80f0: 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76  */.  i16 nReserv
8100: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8110: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
8120: 75 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e  used bytes at en
8130: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a  d of each page *
8140: 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73  /.  u32 vfsFlags
8150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8160: 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c  /* Flags for sql
8170: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
8180: 20 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72   */.  u32 sector
8190: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
81a0: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
81b0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
81c0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  rollback */.  in
81d0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
81e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
81f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
8200: 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  a page */.  Pgno
8210: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
8220: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
8230: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
8240: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
8250: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
8260: 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20  SizeLimit;      
8270: 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66   /* Size limit f
8280: 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  or persistent jo
8290: 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20  urnal files */. 
82a0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
82b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
82c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
82d0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
82e0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
82f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
8300: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
8310: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
8320: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
8330: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
8340: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
8350: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
8360: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
8370: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
8380: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
8390: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  BusyHandler */. 
83a0: 20 69 6e 74 20 61 53 74 61 74 5b 33 5d 3b 20 20   int aStat[3];  
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83c0: 54 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73  Total cache hits
83d0: 2c 20 6d 69 73 73 65 73 20 61 6e 64 20 77 72 69  , misses and wri
83e0: 74 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  tes */.#ifdef SQ
83f0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
8400: 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
8410: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
8420: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a  ase pages read *
8430: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
8440: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
8450: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
8460: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
8470: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
8480: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
8490: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
84a0: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
84b0: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
84c0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
84d0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
84e0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28  data */.  void (
84f0: 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29  *xCodecSizeChng)
8500: 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b  (void*,int,int);
8510: 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61   /* Notify of pa
8520: 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  ge size changes 
8530: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8540: 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20  ecFree)(void*); 
8550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8560: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
8570: 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69  e codec */.  voi
8580: 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20  d *pCodec;      
8590: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
85a0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
85b0: 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20  odec... methods 
85c0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72  */.#endif.  char
85d0: 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20   *pTmpSpace;    
85e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
85f0: 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  .pageSize bytes 
8600: 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70  of space for tmp
8610: 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65   use */.  PCache
8620: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
8630: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8640: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
8650: 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66  bject */.#ifndef
8660: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
8670: 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20  .  Wal *pWal;   
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8690: 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  * Write-ahead lo
86a0: 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e  g used by "journ
86b0: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a  al_mode=wal" */.
86c0: 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20    char *zWal;   
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86e0: 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77   File name for w
86f0: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a  rite-ahead log *
8700: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8710: 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72 20 75  ** Indexes for u
8720: 73 65 20 77 69 74 68 20 50 61 67 65 72 2e 61 53  se with Pager.aS
8730: 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67 65 72  tat[]. The Pager
8740: 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79 20 63  .aStat[] array c
8750: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76  ontains.** the v
8760: 61 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62  alues accessed b
8770: 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49 54 45  y passing SQLITE
8780: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
8790: 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53 53 20  HIT, CACHE_MISS 
87a0: 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57 52 49  .** or CACHE_WRI
87b0: 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f 64 62  TE to sqlite3_db
87c0: 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64  _status()..*/.#d
87d0: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
87e0: 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69 6e 65  _HIT   0.#define
87f0: 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53   PAGER_STAT_MISS
8800: 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45    1.#define PAGE
8810: 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32 0a 0a  R_STAT_WRITE 2..
8820: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
8830: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
8840: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
8850: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
8860: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
8870: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
8880: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
8890: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
88a0: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
88b0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
88c0: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
88d0: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
88e0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
88f0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
8900: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
8910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
8920: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
8930: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
8940: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
8950: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
8960: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
8970: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
8980: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
8990: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
89a0: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
89b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
89c0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
89d0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69  ournal */.# defi
89e0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
89f0: 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    v++.#else.# de
8a00: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8a10: 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  v).#endif..../*.
8a20: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
8a30: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
8a40: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
8a50: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
8a60: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
8a70: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
8a80: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
8a90: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
8aa0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
8ab0: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
8ac0: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
8ad0: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
8ae0: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
8af0: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
8b00: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
8b10: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
8b20: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
8b30: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74  is being.** writ
8b40: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
8b50: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
8b60: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
8b70: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
8b80: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
8b90: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
8ba0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
8bb0: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
8bc0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
8bd0: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
8be0: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
8bf0: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
8c00: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
8c10: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
8c20: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
8c30: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
8c40: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
8c50: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
8c60: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
8c70: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
8c80: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
8c90: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
8ca0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
8cb0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
8cc0: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
8cd0: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
8ce0: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
8cf0: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
8d00: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
8d10: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8d20: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
8d30: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
8d40: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
8d50: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
8d60: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
8d70: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
8d80: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
8d90: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
8da0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
8db0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
8dc0: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
8dd0: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
8de0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
8df0: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
8e00: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
8e10: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
8e20: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
8e30: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
8e40: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
8e50: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
8e60: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
8e70: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
8e80: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
8e90: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
8ea0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
8eb0: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
8ec0: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
8ed0: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
8ee0: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
8ef0: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
8f00: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
8f10: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
8f20: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
8f30: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
8f40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
8f50: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
8f60: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
8f70: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
8f80: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
8f90: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
8fa0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20   size of the of 
8fb0: 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64  each page record
8fc0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
8fd0: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74  is given by.** t
8fe0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
8ff0: 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ro..*/.#define J
9000: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
9010: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
9020: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
9030: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
9040: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
9050: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  r this pager. Th
9060: 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68  is is usually th
9070: 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20  e same .** size 
9080: 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  as a single disk
9090: 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73   sector. See als
90a0: 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  o setSectorSize(
90b0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  )..*/.#define JO
90c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
90d0: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
90e0: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
90f0: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
9100: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9110: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
9120: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9130: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
9140: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
9150: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
9160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
9170: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
9180: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
9190: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
91a0: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
91b0: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
91c0: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
91d0: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
91e0: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
91f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9200: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
9210: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
9220: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
9230: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
9240: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
9250: 20 54 68 65 20 6d 61 63 72 6f 20 55 53 45 46 45   The macro USEFE
9260: 54 43 48 20 69 73 20 74 72 75 65 20 69 66 20 77  TCH is true if w
9270: 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  e are allowed to
9280: 20 75 73 65 20 74 68 65 20 78 46 65 74 63 68 20   use the xFetch 
9290: 61 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20  and xUnfetch.** 
92a0: 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 61 63  interfaces to ac
92b0: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
92c0: 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d  e using memory-m
92d0: 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69  apped I/O..*/.#i
92e0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
92f0: 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e  P_SIZE>0.# defin
9300: 65 20 55 53 45 46 45 54 43 48 28 78 29 20 28 28  e USEFETCH(x) ((
9310: 78 29 2d 3e 62 55 73 65 46 65 74 63 68 29 0a 23  x)->bUseFetch).#
9320: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 53  else.# define US
9330: 45 46 45 54 43 48 28 78 29 20 30 0a 23 65 6e 64  EFETCH(x) 0.#end
9340: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
9350: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
9360: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
9370: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
9380: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
9390: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
93a0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
93b0: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
93c0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
93d0: 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33  or (type sqlite3
93e0: 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75  _file*)..** Retu
93f0: 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f  rn 0 if it is no
9400: 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a  t open, or non-z
9410: 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20  ero (but not 1) 
9420: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
9430: 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  This is so that 
9440: 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20  expressions can 
9450: 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a  be written as:.*
9460: 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65  *.**   if( isOpe
9470: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
9480: 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74  { ....**.** inst
9490: 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69  ead of.**.**   i
94a0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  f( pPager->jfd->
94b0: 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a  pMethods ){ ....
94c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65  */.#define isOpe
94d0: 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70  n(pFd) ((pFd)->p
94e0: 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a  Methods!=0)../*.
94f0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
9500: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
9510: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
9520: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
9530: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
9540: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
9550: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
9560: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
9570: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
9580: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
9590: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
95a0: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
95b0: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
95c0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
95d0: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
95e0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
95f0: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
9600: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
9610: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20 30  rames(v,w,x,y) 0
9620: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f  .# define pagerO
9630: 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
9640: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  z) SQLITE_OK.# d
9650: 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e  efine pagerBegin
9660: 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
9670: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
9680: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
9690: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
96a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
96b0: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
96c0: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
96d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
96e0: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
96f0: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
9700: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
9710: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
9720: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
9730: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
9740: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9750: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
9760: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
9770: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
9780: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
9790: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
97a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
97b0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
97c0: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
97d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
97e0: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
97f0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9800: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
9810: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9820: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
9830: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
9840: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9850: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
9860: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9870: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9880: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9890: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
98a0: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
98b0: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
98c0: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
98d0: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
98e0: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
98f0: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9900: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9910: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
9920: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9930: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
9940: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
9950: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
9960: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
9970: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9980: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9990: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
99a0: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
99b0: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
99c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
99d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
99e0: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
99f0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9a00: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9a10: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
9a20: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
9a30: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
9a40: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
9a50: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
9a60: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
9a70: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9a80: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9a90: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9aa0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9ab0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9ac0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9ad0: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9af0: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9b00: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9b10: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
9b20: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
9b30: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
9b40: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
9b50: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
9b60: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
9b70: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9b80: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9b90: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9ba0: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9bb0: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9bc0: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9bd0: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9be0: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9bf0: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9c00: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9c10: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9c20: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
9c30: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9c40: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
9c50: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
9c60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
9c70: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9c80: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9c90: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9ca0: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9cb0: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9cc0: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9cd0: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9ce0: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9cf0: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9d00: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9d10: 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e  assert( p->noSyn
9d20: 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
9d30: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9d40: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9d50: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
9d60: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9d70: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9d80: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9d90: 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
9da0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9db0: 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53  R_ERROR && p->eS
9dc0: 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
9dd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9de0: 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d  pagerUseWal(p)==
9df0: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
9e00: 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  f changeCountDon
9e10: 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45  e is set, a RESE
9e20: 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65  RVED lock or gre
9e30: 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
9e40: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69  d.  ** on the fi
9e50: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
9e60: 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  t( pPager->chang
9e70: 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c  eCountDone==0 ||
9e80: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
9e90: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c  .  assert( p->eL
9eb0: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
9ec0: 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  K );..  switch( 
9ed0: 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  p->eState ){.   
9ee0: 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e   case PAGER_OPEN
9ef0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9f00: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
9f10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9f20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9f30: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
9f40: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
9f50: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
9f60: 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c  ->pPCache)==0 ||
9f70: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
9f80: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
9f90: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9fa0: 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20  R_READER:.      
9fb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9fc0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9fd0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
9fe0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9ff0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a000: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a010: 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
a020: 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  K );.      break
a030: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a040: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a  R_WRITER_LOCKED:
a050: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a060: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
a070: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a080: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a090: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a0a0: 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  K );.      if( !
a0b0: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a0c0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  er) ){.        a
a0d0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a0e0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
a0f0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
a100: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
a110: 4e 43 55 52 52 45 4e 54 0a 20 20 20 20 20 20 61  NCURRENT.      a
a120: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a130: 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  bSize==pPager->d
a140: 62 4f 72 69 67 53 69 7a 65 20 7c 7c 20 70 50 61  bOrigSize || pPa
a150: 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 29 3b  ger->pAllRead );
a160: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 73  .#endif.      as
a170: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a180: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a190: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a1a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a1b0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a1c0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a1d0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a1e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
a1f0: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
a200: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a210: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a220: 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20  R_CACHEMOD:.    
a230: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a240: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a250: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a260: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a270: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a280: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
a290: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a2a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
a2b0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
a2c0: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
a2d0: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
a2e0: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
a2f0: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
a300: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
a310: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
a320: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
a330: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
a340: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
a350: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
a360: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
a370: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
a380: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
a390: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
a3a0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
a3b0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a3c0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a3d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a3e0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a3f0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a400: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a410: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a420: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a430: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a440: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a450: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a460: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
a470: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a480: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a490: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a4a0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a4b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a4c0: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a4d0: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a4f0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a500: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
a510: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a520: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a530: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a540: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a550: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a560: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a570: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a580: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a590: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
a5a0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a5c0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a5d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a5e0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a5f0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a600: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a610: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a620: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a630: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a650: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a660: 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e<=pPager->dbHin
a670: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a680: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a690: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a6a0: 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73  ISHED:.      ass
a6b0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a6c0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a6d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a6e0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a6f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a700: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a710: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a720: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a730: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a740: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a750: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a760: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a770: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a780: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a790: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a7a0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a7b0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a7c0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a7d0: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a  _ERROR:.      /*
a7e0: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
a7f0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
a800: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
a810: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69  e to the pager i
a820: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52  f.      ** in ER
a830: 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
a840: 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73  wise the pager s
a850: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
a860: 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20  dy dropped.     
a870: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e   ** back to OPEN
a880: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
a890: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a8a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
a8b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a8c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a8d0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a8e0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a8f0: 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  )>0 );.      bre
a900: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
a910: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a920: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
a930: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a940: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
a950: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a960: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
a970: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
a980: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
a990: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
a9a0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
a9b0: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
a9c0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
a9d0: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
a9e0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
a9f0: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
aa00: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
aa10: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
aa20: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
aa30: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
aa40: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
aa50: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
aa60: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
aa70: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
aa80: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
aa90: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
aaa0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
aab0: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
aac0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
aad0: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
aae0: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
aaf0: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
ab00: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
ab10: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
ab20: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
ab30: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
ab40: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
ab50: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
ab60: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
ab70: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
ab80: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
ab90: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
aba0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
abb0: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
abc0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
abd0: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
abe0: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
abf0: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
ac00: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
ac10: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
ac20: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
ac30: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
ac40: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
ac50: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
ac60: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
ac70: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
ac80: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
ac90: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
aca0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
acb0: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
acc0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
acd0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
ace0: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
acf0: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
ad00: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ad10: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
ad20: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
ad30: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
ad40: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ad50: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
ad60: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
ad70: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ad80: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ad90: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
ada0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
adb0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
adc0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
add0: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
ade0: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
adf0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
ae00: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
ae10: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
ae20: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
ae30: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
ae40: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
ae50: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
ae60: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
ae70: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
ae80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
ae90: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
aea0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
aeb0: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
aec0: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
aed0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
aee0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
aef0: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
af00: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
af10: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
af20: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
af30: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
af40: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
af50: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
af60: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
af70: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
af80: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
af90: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
afa0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
afb0: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
afc0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
afd0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
afe0: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
aff0: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b000: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b010: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
b020: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
b030: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
b040: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b050: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b060: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
b070: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
b080: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b090: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b0a0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b0b0: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b0c0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b0d0: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b0e0: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b0f0: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b100: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b110: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b120: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b130: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b140: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b150: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b160: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b170: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b180: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b190: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
b1a0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
b1b0: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
b1c0: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
b1d0: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
b1e0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
b1f0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
b200: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
b210: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
b220: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
b230: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
b240: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
b250: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
b260: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
b270: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
b280: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
b290: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
b2a0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
b2b0: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
b2c0: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
b2d0: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
b2e0: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
b2f0: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
b300: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
b310: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
b320: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
b330: 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  r;.  PagerSavepo
b340: 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70  int *p;.  Pgno p
b350: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
b360: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b370: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
b380: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
b390: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72  .    p = &pPager
b3a0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
b3b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
b3c0: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
b3d0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
b3e0: 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76  otNull(p->pInSav
b3f0: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b420: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
b430: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
b440: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b450: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
b460: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
b470: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
b480: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
b490: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
b4a0: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
b4b0: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b4c0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b4d0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b4e0: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b4f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b500: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b510: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b520: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b530: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b540: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b550: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b560: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b570: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b580: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b590: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b5a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b5b0: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b5c0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b5d0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b5e0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b5f0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b600: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b610: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b620: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b630: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b640: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b650: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b660: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b670: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b680: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b690: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b6a0: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b6b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b6c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b6d0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b6e0: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b6f0: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b700: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b710: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b720: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b730: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b740: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b750: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b760: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b770: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b780: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b790: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b7a0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b7b0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b7c0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b7d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b7e0: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b7f0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b800: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b810: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b820: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b830: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b840: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b850: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b870: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b880: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b890: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b8a0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b8b0: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b8c0: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b8d0: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b8e0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b8f0: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b900: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b910: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b920: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b930: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b940: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b950: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b960: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b970: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b980: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b990: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b9a0: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b9b0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b9c0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b9d0: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b9e0: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b9f0: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
ba00: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ba10: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
ba20: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
ba30: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
ba40: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
ba50: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
ba60: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
ba70: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
ba80: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
ba90: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
baa0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
bab0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
bac0: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
bad0: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
bae0: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
baf0: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
bb00: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
bb10: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
bb20: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
bb30: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
bb40: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
bb50: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
bb60: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
bb70: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
bb80: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
bb90: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
bba0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
bbb0: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
bbc0: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
bbd0: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
bbe0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
bbf0: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
bc00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bc10: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bc20: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bc30: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bc40: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
bc50: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bc60: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bc70: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bc80: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bc90: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bca0: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bcb0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bcc0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bcd0: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bce0: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bcf0: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bd00: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bd10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bd20: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bd30: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bd40: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bd50: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bd60: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bd70: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bd80: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bd90: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bda0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bdb0: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bdc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bdd0: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bde0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bdf0: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
be00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
be10: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
be20: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
be30: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
be40: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
be50: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
be60: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
be70: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
be80: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
be90: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bea0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
beb0: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
bec0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bed0: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bee0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bef0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bf00: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bf10: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bf20: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bf30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bf40: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bf50: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
bf60: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bf70: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bf80: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bf90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bfa0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bfb0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bfc0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bfd0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bfe0: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bff0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
c000: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
c010: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
c020: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
c030: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
c040: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
c050: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c060: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
c070: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
c080: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
c090: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
c0a0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c0b0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c0c0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c0d0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c0e0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c0f0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c100: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
c110: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
c120: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
c130: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
c140: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
c150: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c160: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c170: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c180: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c190: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c1a0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c1b0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c1c0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c1d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c1e0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c1f0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c200: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c210: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c230: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c240: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c250: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c260: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c270: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c280: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c290: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c2a0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c2b0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c2c0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c2d0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c2e0: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c310: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c320: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c330: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c350: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c360: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c390: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c3a0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c3b0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c3c0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c3d0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c3e0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c3f0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c400: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c410: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c420: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c430: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c440: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c450: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c460: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c470: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c480: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c490: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c4a0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c4b0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c4c0: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c4d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c4e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c4f0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c500: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c510: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c520: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c530: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c540: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c550: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c560: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c570: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c580: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c590: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c5a0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c5b0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c5c0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c5d0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c5e0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c5f0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c600: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c610: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c620: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c630: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c640: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c650: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c660: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c670: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c680: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c690: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c6a0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c6b0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c6c0: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c6d0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c6e0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c6f0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c700: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c710: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c720: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c730: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c740: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c750: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c760: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c770: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c780: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c790: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c7a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c7b0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c7c0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c7d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c7e0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c7f0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c800: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c810: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c820: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c830: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c840: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c850: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c860: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c870: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c880: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c890: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c8a0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c8b0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c8c0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c8d0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c8e0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c8f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c900: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c910: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c920: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c930: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c940: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c950: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c960: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c970: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c980: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c990: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c9a0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c9b0: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c9c0: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c9d0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c9e0: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c9f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
ca00: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
ca10: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
ca20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
ca30: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
ca40: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
ca50: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
ca60: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
ca70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ca80: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
ca90: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
caa0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
cab0: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
cac0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
cad0: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
cae0: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
caf0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
cb00: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
cb10: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
cb20: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
cb30: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
cb40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
cb50: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
cb60: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
cb70: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
cb80: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cb90: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
cba0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
cbb0: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
cbc0: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
cbd0: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
cbe0: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
cbf0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
cc00: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cc10: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cc20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cc30: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cc40: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
cc50: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cc60: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cc70: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cc80: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cc90: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cca0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
ccb0: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
ccc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
ccd0: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cce0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
ccf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cd00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cd10: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cd20: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cd30: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cd40: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cd50: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
cd60: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
cd70: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
cd80: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cd90: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
cda0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cdb0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cdc0: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cdd0: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cde0: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cdf0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
ce00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ce10: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
ce20: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
ce30: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
ce40: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
ce50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
ce60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
ce70: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
ce80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ce90: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cea0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ceb0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cec0: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
ced0: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cee0: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cef0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cf00: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cf10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cf20: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cf30: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cf40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cf50: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
cf60: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cf70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cf80: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cfa0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cfb0: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cfc0: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cfd0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cff0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
d000: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
d010: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
d040: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d050: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
d060: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
d070: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
d080: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
d090: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
d0a0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d0b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d0c0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d0d0: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d0e0: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d0f0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d100: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d110: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d120: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d130: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d140: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d150: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d160: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d170: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d180: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d190: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d1a0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d1b0: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d1c0: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d1d0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d1e0: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d1f0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d200: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d210: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d220: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d230: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d240: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d250: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d260: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d270: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d280: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d290: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d2a0: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d2b0: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d2c0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d2d0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d2e0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d2f0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d300: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d310: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d320: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d340: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d350: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d360: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d370: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d380: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d390: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d3a0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d3b0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d3c0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d3d0: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d3e0: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d3f0: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d400: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d410: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d420: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d430: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d440: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d450: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d460: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d470: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d480: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d490: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d4a0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d4b0: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d4c0: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d4d0: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d4e0: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d4f0: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d500: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d580: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d590: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d5a0: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d5c0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d5d0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d5e0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d5f0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d600: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d610: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d620: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d630: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d640: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d650: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d660: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d670: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d680: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d690: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d6a0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d6b0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d6c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d6d0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d6e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d6f0: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d710: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d720: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d730: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d740: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d750: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d760: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d770: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d780: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d790: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d7a0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d7b0: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d7c0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d7d0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d7e0: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d7f0: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d800: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d810: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d820: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d830: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d840: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d850: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d860: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d870: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d880: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d890: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d8a0: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d8b0: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d8c0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d8d0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d8e0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d8f0: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d900: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d910: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d920: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d930: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d940: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d950: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d960: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d970: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d980: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d990: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d9a0: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d9b0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d9c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d9d0: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d9e0: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d9f0: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
da00: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
da10: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
da20: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
da30: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
da40: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
da50: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
da60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
da70: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
da80: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
da90: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
daa0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
dab0: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
dac0: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
dad0: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
dae0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
daf0: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
db00: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
db10: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
db20: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
db30: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
db60: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
db70: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
db80: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
db90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dba0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
dbb0: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
dbc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
dbd0: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
dbe0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
dbf0: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
dc00: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
dc10: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
dc20: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
dc30: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
dc40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc50: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dc60: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dc70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dc80: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dc90: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dca0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dcb0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dcc0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dcd0: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dce0: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dcf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dd00: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dd10: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dd20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dd30: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dd40: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dd50: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dd60: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dd70: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dd80: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dd90: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dda0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
ddb0: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
ddc0: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
ddd0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dde0: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
ddf0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
de00: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
de10: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
de20: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
de30: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
de40: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
de50: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
de60: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
de70: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
de80: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
de90: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
dea0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
deb0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
dec0: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
ded0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dee0: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
def0: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
df00: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
df10: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
df20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
df30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
df40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
df50: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
df60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
df70: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
df80: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
df90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dfa0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
dfb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
dfc0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
dfd0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
dfe0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
dff0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
e000: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
e010: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
e020: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e030: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
e040: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
e050: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
e060: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
e070: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e080: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
e090: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
e0a0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e0b0: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e0c0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e0d0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e0e0: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e0f0: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e100: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e110: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e120: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e130: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e140: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e150: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e160: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e170: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e180: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e190: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e1a0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e1b0: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e1c0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e1d0: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e1e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e1f0: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e200: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e210: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e220: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e230: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e270: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e280: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e290: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e2a0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e2b0: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e2c0: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e2d0: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e2e0: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e2f0: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e300: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e310: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e340: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e350: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e360: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e390: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e3a0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e3b0: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e3c0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e3d0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e3e0: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e3f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e400: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e410: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e420: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e430: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e440: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e450: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e460: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e470: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e480: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e490: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e4a0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e4b0: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e4c0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e4d0: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e4e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e4f0: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e500: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e510: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e520: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e530: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e540: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e550: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e560: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e570: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e590: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e5a0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e5b0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e5c0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e5d0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e5e0: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e5f0: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e600: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e610: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e620: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e630: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e640: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e650: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e660: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e670: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e680: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e690: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e6a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e6b0: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e6c0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e6d0: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e6e0: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e6f0: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e700: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e710: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e720: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e730: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e740: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e750: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e760: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e770: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e780: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e790: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e7a0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e7b0: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e7c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e7d0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e7e0: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e7f0: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e800: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e810: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e820: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e830: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e840: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e850: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e860: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e870: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e880: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e890: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e8a0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e8b0: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e8c0: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e8d0: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e8e0: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e8f0: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e900: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e910: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e920: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e930: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e940: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e950: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e960: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e970: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e980: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e990: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e9a0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e9b0: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e9c0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e9d0: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e9e0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e9f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
ea00: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
ea10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ea20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ea30: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
ea40: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
ea50: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
ea60: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
ea70: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
ea80: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
ea90: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
eaa0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
eab0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
eac0: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
ead0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
eae0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
eaf0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
eb00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
eb10: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
eb20: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
eb30: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
eb40: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eb50: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
eb60: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
eb70: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
eb80: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
eb90: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
eba0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ebb0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ebc0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ebd0: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
ebe0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ebf0: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
ec00: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
ec10: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
ec20: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ec30: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
ec40: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
ec50: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ec60: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ec70: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ec80: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ec90: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eca0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ecb0: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ecc0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ecd0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ece0: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ecf0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ed00: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ed10: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ed20: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ed30: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ed40: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
ed50: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ed60: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ed70: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ed80: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ed90: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
eda0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
edb0: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
edc0: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
edd0: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ede0: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
edf0: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
ee00: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ee10: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ee20: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ee30: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ee40: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
ee50: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
ee60: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
ee70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
ee80: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ee90: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
eea0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
eeb0: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
eec0: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
eed0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
eee0: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
eef0: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
ef00: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ef10: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ef20: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ef30: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ef40: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
ef50: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
ef60: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
ef70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ef80: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
ef90: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
efa0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
efb0: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
efc0: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
efd0: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
efe0: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
eff0: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
f000: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
f010: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
f020: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
f030: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
f040: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
f050: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f060: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
f070: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
f080: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
f090: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f0a0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f0b0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f0c0: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f0d0: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f0e0: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f0f0: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f100: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f110: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f120: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f130: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f140: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f150: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f160: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f170: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f180: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f190: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f1a0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f1b0: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f1c0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f1d0: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f1e0: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f1f0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f200: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f210: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f220: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f230: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f240: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f250: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f260: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f270: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f280: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f290: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f2a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f2b0: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f2c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f2d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f2e0: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f300: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f310: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f320: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f330: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f340: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f350: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f360: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f370: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f390: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f3a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f3b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f3c0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f3d0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f3e0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f3f0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f400: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f410: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f420: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f430: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f440: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f450: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f460: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f470: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f480: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f490: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f4a0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f4b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f4c0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f4d0: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f4e0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f4f0: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f500: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f510: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f520: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f530: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f540: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f550: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f560: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f570: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f580: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f590: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f5a0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f5b0: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f5c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f5d0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f5e0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f5f0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f600: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f610: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f620: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f630: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f640: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f650: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f660: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f670: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f680: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f690: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f6a0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f6b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f6c0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f6d0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f6e0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f6f0: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f700: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f710: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f720: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f730: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f740: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f750: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f760: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f770: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f780: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f790: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f7a0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f7b0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f7c0: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f7d0: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f7f0: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f800: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f810: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f820: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f850: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f860: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f870: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f880: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f890: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f8a0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f8b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f8c0: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f8d0: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f8e0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f8f0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f900: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f910: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f920: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f930: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f940: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f950: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f960: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f970: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f980: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f990: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f9a0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f9b0: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f9c0: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f9d0: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f9e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f9f0: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
fa00: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
fa10: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
fa20: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
fa30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
fa40: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
fa50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fa60: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
fa70: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
fa80: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
fa90: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
faa0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
fab0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fac0: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fad0: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fae0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
faf0: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
fb00: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fb10: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fb20: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fb30: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fb40: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
fb50: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fb60: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fb70: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fb80: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fb90: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
fba0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fbb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fbc0: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fbd0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fbe0: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fbf0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fc00: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fc10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fc20: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fc30: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fc40: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fc50: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fc60: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fc70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fc80: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fc90: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fca0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fcb0: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fcc0: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fcd0: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fce0: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fcf0: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fd00: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fd10: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fd20: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fd30: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fd40: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fd50: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fd60: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fd70: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fd80: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fd90: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fda0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fdb0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fdc0: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fdd0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fde0: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fdf0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fe00: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fe10: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fe20: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fe30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fe40: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fe50: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fe60: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fe70: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fe80: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fe90: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fea0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
feb0: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fed0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fee0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fef0: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
ff00: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
ff10: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
ff20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ff30: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
ff40: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ff50: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
ff60: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
ff70: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
ff80: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
ff90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ffa0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ffb0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
ffc0: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
ffd0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
ffe0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
fff0: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
10000 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
10010 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
10020 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
10030 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
10040 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
10050 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
10060 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
10070 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
10080 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
10090 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
100a0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
100b0 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
100c0 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
100d0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
100e0 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
100f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10100 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10110 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10120 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10130 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10140 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
10150 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10160 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10170 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10180 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10190 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
101a0 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
101b0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
101c0 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
101d0 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
101e0 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
101f0 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10200 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10210 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10220 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10230 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10240 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
10250 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10260 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10270 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10280 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10290 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
102a0 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
102b0 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
102c0 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
102d0 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
102e0 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
102f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10300 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10310 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10320 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10330 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10340 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
10350 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10360 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10370 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10380 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10390 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
103a0 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
103b0 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
103c0 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
103d0 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
103e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
103f0 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10400 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10410 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10420 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10430 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10440 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
10450 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10460 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10470 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10480 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10490 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
104a0 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
104b0 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
104c0 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
104d0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
104e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
104f0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10500 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10510 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10530 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10540 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
10550 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10560 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10570 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10580 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10590 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
105a0 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
105b0 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
105c0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
105d0 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
105e0 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
105f0 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10600 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10610 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10620 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10630 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10640 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
10650 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10660 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10670 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10680 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10690 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
106a0 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
106b0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
106c0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
106d0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
106e0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
106f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10700 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10710 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10720 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10730 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10740 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
10750 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
10760 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
10770 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
10780 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
10790 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
107a0 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
107b0 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
107c0 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
107d0 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
107e0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
107f0 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
10800 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10810 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10820 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10830 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10840 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
10850 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
10860 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
10870 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
10880 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10890 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
108a0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
108b0 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
108c0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
108d0 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
108e0 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
108f0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
10900 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10910 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10920 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10930 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10940 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
10950 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
10960 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
10970 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
10980 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
10990 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
109a0 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
109b0 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
109c0 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
109d0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
109e0 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
109f0 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
10a00 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10a10 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10a20 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10a30 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10a40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
10a50 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
10a60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10a70 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10a80 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10aa0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10ab0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10ac0 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10ae0 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10af0 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10b00 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b20 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10b30 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10b40 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10b50 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10b60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10b70 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10b80 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10b90 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10bb0 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10bc0 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10bd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10be0 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10c00 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10c10 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10c20 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10c30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10c40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10c50 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10c60 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10c70 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c90 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10ca0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10cb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10cc0 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10cd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10ce0 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10cf0 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10d00 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10d10 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10d20 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10d30 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10d40 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10d50 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10d60 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10d70 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10d80 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10d90 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10da0 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10db0 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10dc0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10dd0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10de0 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10df0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10e00 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10e10 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10e20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10e30 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10e40 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10e50 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10e60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10e70 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10e80 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10e90 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10ea0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10eb0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10ec0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10ed0 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10ee0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10ef0 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10f00 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10f10 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10f20 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10f30 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10f40 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10f50 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10f60 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10f70 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10f80 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10f90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10fa0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10fb0 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10fc0 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10fd0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10fe0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10ff0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
11000 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
11010 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
11020 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
11030 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
11040 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
11050 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
11060 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11070 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11080 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
11090 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
110a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
110d0 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
110e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
110f0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11100 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11110 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11120 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11130 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11140 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
11150 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
11160 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
11170 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
11180 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
11190 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
111a0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
111b0 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
111c0 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
111d0 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
111e0 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
111f0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11200 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11210 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11220 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11230 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11240 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
11250 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
11260 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
11270 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
11280 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
11290 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
112a0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
112b0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
112c0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
112d0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
112e0 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
112f0 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11300 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11310 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11320 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11330 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11340 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
11350 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11360 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
11370 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
11380 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
113a0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
113b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
113c0 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
113d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
113e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
113f0 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11400 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11410 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11420 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11430 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11440 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11450 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11460 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11470 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11480 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11490 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
114a0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
114b0 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
114c0 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
114d0 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
114e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
114f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11500 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11510 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11520 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11540 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11550 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11560 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11570 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11580 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11590 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
115a0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
115b0 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
115c0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
115d0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
115e0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
115f0 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11600 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11610 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11620 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11630 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11640 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11650 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11660 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11670 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11680 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11690 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
116a0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
116b0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
116c0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
116d0 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
116e0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
116f0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11700 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11710 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11720 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11730 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11740 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11750 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11760 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11770 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11780 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11790 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
117a0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
117b0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
117c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
117d0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
117e0 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
117f0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
11800 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
11810 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11820 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11830 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11840 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
11850 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11860 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
11870 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
11880 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
11890 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
118a0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
118b0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
118c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
118d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
118e0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
118f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11900 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11910 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11920 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11930 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11940 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
11950 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11960 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
11970 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
11980 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
11990 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
119a0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
119b0 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
119c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
119d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
119e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
119f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11a00 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
11a10 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11a20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11a30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11a40 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  OMIT_CONCURRENT.
11a50 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61 72  /*.** If they ar
11a60 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 2c 20 62  e not already, b
11a70 65 67 69 6e 20 72 65 63 6f 72 64 69 6e 67 20 61  egin recording a
11a80 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72  ll pages read fr
11a90 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
11aa0 65 72 0a 2a 2a 20 62 79 20 74 68 65 20 62 2d 74  er.** by the b-t
11ab0 72 65 65 20 6c 61 79 65 72 20 54 68 69 73 20 69  ree layer This i
11ac0 73 20 75 73 65 64 20 62 79 20 63 6f 6e 63 75 72  s used by concur
11ad0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
11ae0 73 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  s. Return.** SQL
11af0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11b00 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
11b10 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 53  te error code (S
11b20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20  QLITE_NOMEM) if 
11b30 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
11b40 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
11b50 65 33 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63  e3PagerBeginConc
11b60 75 72 72 65 6e 74 28 50 61 67 65 72 20 2a 70 50  urrent(Pager *pP
11b70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
11b80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11b90 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52  f( pPager->pAllR
11ba0 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ead==0 ){.    pP
11bb0 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d  ager->pAllRead =
11bc0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
11bd0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
11be0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
11bf0 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d  ager->pAllRead==
11c00 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
11c10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11c20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11c30 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69   rc;.}../* !defi
11c40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11c50 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a  CONCURRENT).**.*
11c60 2a 20 53 74 6f 70 20 72 65 63 6f 72 64 69 6e 67  * Stop recording
11c70 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20   all pages read 
11c80 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
11c90 61 79 65 72 20 62 79 20 74 68 65 20 62 2d 74 72  ayer by the b-tr
11ca0 65 65 20 6c 61 79 65 72 0a 2a 2a 20 61 6e 64 20  ee layer.** and 
11cb0 64 69 73 63 61 72 64 20 61 6e 79 20 63 75 72 72  discard any curr
11cc0 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a  ent records..*/.
11cd0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
11ce0 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 50  rEndConcurrent(P
11cf0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11d00 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
11d10 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
11d20 6c 6c 52 65 61 64 29 3b 0a 20 20 70 50 61 67 65  llRead);.  pPage
11d30 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d 20 30 3b  r->pAllRead = 0;
11d40 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
11d50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
11d60 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 52 65  URRENT).**.** Re
11d70 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
11d80 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
11d90 77 61 6c 20 6d 6f 64 65 2e 20 46 61 6c 73 65 20  wal mode. False 
11da0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
11db0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
11dc0 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
11dd0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
11de0 67 65 72 2d 3e 70 57 61 6c 21 3d 30 3b 0a 7d 0a  ger->pWal!=0;.}.
11df0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11e00 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
11e10 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20   */../*.** Free 
11e20 74 68 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  the Pager.pInJou
11e30 72 6e 61 6c 20 61 6e 64 20 50 61 67 65 72 2e 70  rnal and Pager.p
11e40 41 6c 6c 52 65 61 64 20 62 69 74 76 65 63 20 6f  AllRead bitvec o
11e50 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
11e60 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65  c void pagerFree
11e70 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
11e80 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
11e90 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11ea0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
11eb0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
11ec0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
11ed0 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e 64 43  sqlite3PagerEndC
11ee0 6f 6e 63 75 72 72 65 6e 74 28 70 50 61 67 65 72  oncurrent(pPager
11ef0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
11f00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11f10 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
11f20 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11f30 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
11f40 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
11f50 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
11f60 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
11f70 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
11f80 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
11f90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11fa0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11fb0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
11fc0 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
11fd0 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
11fe0 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
11ff0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
12000 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
12010 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
12020 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
12030 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
12040 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
12050 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
12060 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
12070 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
12080 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
12090 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
120a0 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
120b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
120c0 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
120d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
120e0 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
120f0 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
12100 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
12110 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
12120 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
12130 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
12140 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
12150 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
12160 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
12170 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
12180 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
12190 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
121a0 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
121b0 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
121c0 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
121d0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
121e0 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
121f0 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
12200 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
12210 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
12220 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
12230 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
12240 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
12250 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12260 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
12270 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
12280 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
12290 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
122a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
122b0 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
122c0 70 61 67 65 72 46 72 65 65 42 69 74 76 65 63 73  pagerFreeBitvecs
122d0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 6c 65  (pPager);.  rele
122e0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
122f0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
12300 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
12310 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
12320 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
12330 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
12340 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
12350 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
12360 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
12370 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12380 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12390 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
123a0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
123b0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
123e0 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
123f0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
12400 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
12410 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
12420 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
12430 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
12440 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
12450 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
12460 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
12470 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
12480 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
12490 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
124a0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
124b0 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
124c0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
124d0 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
124e0 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
124f0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
12500 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
12510 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
12520 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
12530 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
12540 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
12550 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12560 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
12570 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12580 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12590 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
125a0 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
125b0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
125c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
125d0 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
125e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
125f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12600 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
12610 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12620 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12630 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
12640 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
12650 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12660 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
12670 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12680 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12690 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
126a0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
126b0 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
126c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
126d0 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
126e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
126f0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
12700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12710 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12720 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12730 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
12740 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
12750 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
12760 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
12770 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
12780 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12790 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
127a0 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
127b0 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
127c0 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
127d0 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
127e0 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
127f0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
12800 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
12810 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
12820 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
12830 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12840 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
12850 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12860 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
12870 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
12880 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12890 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
128a0 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
128b0 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
128c0 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
128d0 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
128e0 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
128f0 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
12900 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
12910 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
12920 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
12930 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
12940 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
12950 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
12960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12970 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
12980 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12990 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
129a0 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
129b0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
129c0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
129d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
129e0 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
129f0 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
12a00 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
12a10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12a20 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
12a30 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
12a40 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
12a50 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
12a60 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12a70 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
12a80 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12a90 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12aa0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12ab0 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12ac0 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12ad0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12ae0 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12af0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12b00 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
12b10 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
12b20 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
12b30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
12b40 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
12b50 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
12b60 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
12b70 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12b80 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12b90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12bb0 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
12bc0 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
12bd0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12be0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
12bf0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12c00 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12c10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12c20 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
12c30 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
12c40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12c50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12c60 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12c70 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
12c80 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12c90 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12ca0 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12cb0 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12cc0 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12cd0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12ce0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12cf0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12d00 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12d10 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
12d20 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12d30 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12d40 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12d50 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12d60 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12d70 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12d80 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12d90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12da0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12db0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12dc0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12dd0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12de0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12df0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12e00 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12e10 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12e20 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12e30 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12e40 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12e50 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12e60 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12e70 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12e80 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12e90 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12ea0 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12eb0 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12ec0 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12ed0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12ee0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12ef0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12f00 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12f10 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12f20 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12f30 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12f40 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12f50 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12f60 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12f70 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12f80 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12f90 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12fa0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12fb0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12fc0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12fd0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12fe0 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12ff0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
13000 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
13010 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13020 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
13030 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
13040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13050 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
13060 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
13070 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
13080 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
13090 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
130a0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
130b0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
130c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
130d0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
130e0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
130f0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
13100 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
13110 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
13120 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
13130 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
13140 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
13150 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
13160 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
13170 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
13180 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
13190 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
131a0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
131b0 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
131c0 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
131d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
131e0 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
131f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13200 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
13210 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
13220 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
13230 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
13240 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
13250 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
13260 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
13270 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
13280 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
13290 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
132a0 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
132b0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
132c0 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
132d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
132e0 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
132f0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
13300 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
13310 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
13320 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
13330 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
13340 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
13350 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
13360 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
13370 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
13380 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
13390 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
133a0 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
133b0 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
133c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
133d0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
133e0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
133f0 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
13400 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
13410 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
13420 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13430 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
13440 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
13450 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
13460 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
13470 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
13480 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13490 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
134a0 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
134b0 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
134c0 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
134d0 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
134e0 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
134f0 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
13500 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13510 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
13520 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
13530 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
13540 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
13550 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
13560 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
13570 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
13580 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
13590 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
135a0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
135b0 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
135c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
135d0 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
135e0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
135f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13600 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
13610 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
13620 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
13630 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
13640 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13650 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
13660 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
13670 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
13680 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
13690 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
136a0 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
136b0 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
136c0 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
136d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
136e0 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
136f0 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13700 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13710 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13720 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
13730 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
13740 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
13750 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
13760 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
13770 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
13780 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13790 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
137a0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
137b0 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
137c0 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
137d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
137e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
137f0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13800 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13810 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13820 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
13830 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
13840 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
13850 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
13860 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
13870 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
13880 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13890 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
138a0 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
138b0 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
138c0 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
138d0 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
138e0 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
138f0 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13900 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13910 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13920 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
13930 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
13940 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
13950 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
13960 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
13970 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
13980 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13990 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
139a0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
139b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
139c0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
139d0 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
139e0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
139f0 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13a00 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13a10 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13a20 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
13a30 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
13a40 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
13a50 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13a60 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
13a70 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
13a80 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13a90 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13aa0 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13ab0 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13ac0 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13ad0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13ae0 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13af0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13b00 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13b10 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13b20 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
13b30 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
13b40 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
13b50 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13b60 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
13b70 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
13b80 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13b90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13ba0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13bb0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13bc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13bd0 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13be0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13c00 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13c10 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13c20 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
13c30 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
13c40 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
13c50 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
13c60 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
13c70 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13c80 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13c90 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
13ca0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13cb0 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
13cc0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13cd0 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13ce0 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
13cf0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
13d00 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
13d10 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
13d20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13d30 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
13d40 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13d50 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13d60 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13d70 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
13d80 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
13d90 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
13da0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
13db0 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
13dc0 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
13dd0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13de0 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
13df0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
13e00 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
13e10 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
13e20 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
13e30 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
13e40 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13e50 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13e60 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13e70 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
13e80 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
13e90 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
13ea0 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
13eb0 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
13ec0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
13ed0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13ee0 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
13ef0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13f00 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
13f10 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
13f20 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
13f30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
13f40 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13f50 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13f60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13f70 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13f80 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
13f90 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
13fa0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
13fb0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
13fc0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13fd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13fe0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13ff0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
14000 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
14010 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
14020 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
14030 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
14040 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
14050 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
14060 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
14070 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14080 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
14090 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
140a0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
140b0 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
140c0 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
140d0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
140e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
140f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14100 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
14110 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71  MORY );.      sq
14120 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
14130 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
14140 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
14150 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14160 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14170 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
14180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
14190 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
141a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
141b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
141c0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
141d0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
141e0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
141f0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
14200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14210 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
14220 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
14230 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14240 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73  new file size is
14250 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
14260 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77  e inode right aw
14270 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ay..          **
14280 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a   Otherwise the j
14290 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73  ournal might res
142a0 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67  urrect following
142b0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e   a power loss an
142c0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
142d0 61 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72  ause the last tr
142e0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c  ansaction to rol
142f0 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20  l back.  See.   
14300 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a         ** https:
14310 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c  //bugzilla.mozil
14320 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e  la.org/show_bug.
14330 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20  cgi?id=1072773. 
14340 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
14350 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14360 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
14370 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
14380 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
14390 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
143a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
143b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
143c0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
143d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
143e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
143f0 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
14400 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
14410 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
14420 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
14430 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14440 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
14450 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
14460 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
14470 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
14480 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14490 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
144a0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
144b0 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
144c0 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
144d0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
144e0 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
144f0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
14500 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
14510 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
14520 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
14530 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
14540 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
14550 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
14560 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
14570 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
14580 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14590 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
145a0 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
145b0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
145c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
145d0 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21  int bDelete = (!
145e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
145f0 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   && sqlite3Journ
14600 61 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  alExists(pPager-
14610 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73  >jfd));.      as
14620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
14630 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14640 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
14650 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
14660 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14670 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14680 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
14690 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
146a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
146b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
146c0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
146d0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
146e0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
146f0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
14700 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
14710 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14720 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14730 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
14740 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
14750 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14760 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
14770 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
14780 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
14790 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
147a0 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
147b0 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
147c0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
147d0 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
147e0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
147f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
14800 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
14810 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
14820 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
14830 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
14840 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
14850 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
14860 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
14870 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
14880 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 61 67   }.#endif..  pag
14890 65 72 46 72 65 65 42 69 74 76 65 63 73 28 70 50  erFreeBitvecs(pP
148a0 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
148b0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
148c0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
148d0 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
148e0 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
148f0 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
14900 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
14910 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
14920 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
14930 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
14940 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
14950 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
14960 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
14970 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
14980 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
14990 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
149a0 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
149b0 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
149c0 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
149d0 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
149e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
149f0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
14a00 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
14a10 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
14a20 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
14a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
14a40 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
14a50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
14a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
14a70 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
14a80 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
14a90 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
14aa0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14ab0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
14ac0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
14ad0 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
14ae0 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
14af0 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
14b00 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
14b10 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
14b20 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
14b30 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
14b40 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
14b50 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
14b60 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
14b70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14b80 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
14b90 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
14ba0 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
14bb0 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
14bc0 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
14bd0 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
14be0 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
14bf0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
14c00 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
14c10 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
14c20 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
14c30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14c40 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
14c50 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
14c60 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
14c70 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
14c80 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
14c90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14ca0 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14cb0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
14cc0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  ->fd) ){.    rc 
14cd0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
14ce0 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
14cf0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
14d00 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c  COMMIT_PHASETWO,
14d10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
14d20 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
14d30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
14d40 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
14d50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14d60 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
14d70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14d80 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
14d90 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
14da0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
14db0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14dc0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14dd0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14de0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
14df0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14e00 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14e10 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14e20 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14e30 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14e40 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14e50 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14e60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14e70 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14e80 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14e90 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
14ea0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
14eb0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14ec0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14ed0 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14ee0 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
14ef0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14f00 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14f10 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14f20 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14f30 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14f40 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14f50 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14f60 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14f70 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14f80 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14f90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14fa0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
14fb0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14fc0 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14fd0 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14fe0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
14ff0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
15000 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
15010 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
15020 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
15030 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
15040 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
15050 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
15060 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
15070 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
15080 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
15090 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
150a0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
150b0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
150c0 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
150d0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
150e0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
150f0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
15100 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
15110 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
15120 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
15130 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
15140 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
15150 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
15160 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
15170 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
15180 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
15190 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
151a0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
151b0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
151c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
151d0 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
151e0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
151f0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
15200 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
15210 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
15220 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
15230 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15240 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
15250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
15260 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
15270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15280 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
15290 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
152a0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
152b0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
152c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
152d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
152e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
152f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
15300 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
15310 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
15320 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
15330 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
15340 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
15350 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
15360 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
15370 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
15380 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
15390 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
153a0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
153b0 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
153c0 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
153d0 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
153e0 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
153f0 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
15400 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15410 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
15420 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
15430 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
15440 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
15450 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
15460 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
15470 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
15480 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
15490 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
154a0 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
154b0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
154c0 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
154d0 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
154e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
154f0 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
15500 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
15510 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
15520 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
15530 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
15540 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
15550 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
15560 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
15570 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
15580 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
15590 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
155a0 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
155b0 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
155c0 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
155d0 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
155e0 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
155f0 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
15600 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
15610 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
15620 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
15630 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
15640 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
15650 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
15660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
15670 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
15680 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
15690 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
156a0 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
156b0 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
156c0 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
156d0 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
156e0 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
156f0 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
15700 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
15710 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
15720 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
15730 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
15740 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
15750 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
15760 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
15770 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
15780 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
15790 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
157a0 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
157b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
157c0 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
157d0 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
157e0 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
157f0 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
15800 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
15810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
15820 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
15830 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
15840 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
15850 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
15860 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
15870 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15880 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
15890 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
158a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
158b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
158c0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
158d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
158e0 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
158f0 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
15900 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
15930 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
15940 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
15950 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
15960 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
15970 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
15980 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
15990 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69  ec */.#endif..#i
159a0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
159b0 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  CODEC./*.** Make
159c0 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72   sure the number
159d0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74   of reserved bit
159e0 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e  s is the same in
159f0 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
15a00 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20  .** pager as it 
15a10 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  is in the source
15a20 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70  .  This comes up
15a30 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63   when a VACUUM c
15a40 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75  hanges the.** nu
15a50 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
15a60 20 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70   bits to the "op
15a70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a  timal" amount..*
15a80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
15a90 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28  gerAlignReserve(
15aa0 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61  Pager *pDest, Pa
15ab0 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66  ger *pSrc){.  if
15ac0 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76  ( pDest->nReserv
15ad0 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76  e!=pSrc->nReserv
15ae0 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  e ){.    pDest->
15af0 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d  nReserve = pSrc-
15b00 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  >nReserve;.    p
15b10 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
15b20 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Dest);.  }.}.#en
15b30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
15b40 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
15b50 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
15b60 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
15b70 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
15b80 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
15b90 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
15ba0 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
15bb0 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
15bc0 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
15bd0 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
15be0 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
15bf0 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
15c00 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
15c10 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
15c20 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
15c30 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
15c40 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
15c50 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
15c60 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
15c70 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
15c80 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
15c90 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
15ca0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15cb0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
15cc0 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
15cd0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
15cf0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
15d00 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15d10 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
15d20 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
15d30 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
15d40 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
15d50 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
15d60 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
15d70 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
15d80 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
15d90 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
15da0 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
15db0 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
15dc0 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
15dd0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
15de0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
15df0 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
15e00 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
15e10 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
15e20 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
15e30 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
15e40 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
15e50 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
15e60 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
15e70 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
15e80 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
15e90 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15ea0 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
15eb0 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
15ec0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15ed0 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
15ee0 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
15ef0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15f00 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
15f10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
15f20 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
15f30 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
15f40 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15f50 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
15f60 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
15f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
15f80 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
15f90 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
15fa0 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
15fb0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
15fc0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15fd0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
15fe0 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
15ff0 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
16000 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
16010 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
16020 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
16030 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
16040 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
16050 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
16060 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
16070 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
16080 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
16090 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
160a0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
160b0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
160c0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
160d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
160e0 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
160f0 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
16100 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
16110 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
16120 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
16130 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
16140 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
16150 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
16160 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
16170 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
16180 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
16190 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
161a0 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
161b0 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
161c0 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
161d0 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
161e0 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
161f0 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
16200 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
16210 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
16220 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
16230 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
16240 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
16250 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
16260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16270 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
16280 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
16290 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162b0 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
162c0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
162d0 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
16300 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
16310 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
16320 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
16330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
16340 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
16350 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
16360 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
16370 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
16380 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
16390 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
163a0 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
163b0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
163c0 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
163d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
163e0 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
163f0 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
16400 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
16410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16420 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16430 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
16440 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
16450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16460 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
16470 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
16480 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
16490 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164b0 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
164c0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
164d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
164e0 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
164f0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
16500 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
16510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
16520 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16540 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
16550 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
16560 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
16570 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
16580 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
16590 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
165a0 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
165b0 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
165c0 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
165d0 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
165e0 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
165f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
16600 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
16610 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
16620 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
16630 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
16640 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
16650 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
16660 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
16670 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
16680 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
16690 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
166a0 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
166b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
166c0 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
166d0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
166e0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
166f0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
16700 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
16710 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
16720 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
16730 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
16740 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
16750 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
16760 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
16770 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
16780 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
16790 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
167a0 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
167b0 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
167c0 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
167d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
167e0 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
167f0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
16800 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
16810 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
16820 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
16830 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
16840 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
16850 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
16860 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
16870 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
16880 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
16890 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
168a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
168b0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
168c0 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
168d0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
168e0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
168f0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
16900 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
16910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
16920 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
16930 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16940 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
16950 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
16960 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
16970 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
16980 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
16990 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
169a0 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
169b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
169c0 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
169d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
169e0 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
169f0 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
16a00 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
16a10 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
16a20 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
16a30 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
16a40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16a50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16a60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16a70 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
16a80 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16a90 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
16aa0 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
16ab0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
16ad0 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
16ae0 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
16af0 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
16b00 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
16b10 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
16b20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
16b30 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
16b40 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
16b50 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
16b60 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
16b70 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
16b80 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
16b90 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
16ba0 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
16bb0 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
16bc0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
16bd0 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
16be0 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
16bf0 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
16c00 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
16c10 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
16c20 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
16c30 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
16c40 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
16c50 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
16c60 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
16c70 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
16c80 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
16c90 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
16ca0 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
16cb0 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
16cc0 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
16cd0 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
16ce0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16cf0 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
16d00 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
16d10 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
16d20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
16d30 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
16d40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
16d50 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
16d60 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
16d70 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
16d80 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
16d90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16da0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
16db0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
16dc0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
16dd0 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  y been played ba
16de0 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  ck before during
16df0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
16e00 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
16e10 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
16e20 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
16e30 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
16e40 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
16e50 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
16e60 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
16e70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16e80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
16e90 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
16ea0 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
16eb0 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
16ec0 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
16ed0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
16ee0 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
16ef0 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
16f00 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
16f10 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
16f20 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
16f30 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
16f40 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
16f50 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
16f60 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
16f70 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
16f80 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
16f90 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
16fa0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
16fb0 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
16fc0 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
16fd0 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
16fe0 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
16ff0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17000 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
17010 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
17020 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
17030 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
17040 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
17050 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
17060 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
17070 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
17080 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
17090 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
170a0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
170b0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
170c0 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
170d0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
170e0 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
170f0 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
17100 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
17110 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
17120 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
17130 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
17140 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
17150 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
17160 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
17170 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
17180 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
17190 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
171a0 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
171b0 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
171c0 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
171d0 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
171e0 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
171f0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
17200 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
17210 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
17220 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
17230 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
17240 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
17250 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
17260 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
17270 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
17280 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
17290 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
172a0 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
172b0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
172c0 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
172d0 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
172e0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
172f0 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
17300 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
17310 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
17320 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
17330 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
17340 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
17350 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
17360 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
17370 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
17380 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17390 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
173a0 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
173b0 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
173c0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
173d0 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
173e0 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
173f0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
17400 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
17410 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
17420 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
17430 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
17440 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
17450 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
17460 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
17470 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
17480 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
17490 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
174a0 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
174b0 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
174c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
174d0 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
174e0 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
174f0 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
17500 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
17510 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
17520 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
17530 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
17540 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
17550 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
17560 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
17570 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
17580 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
17590 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
175a0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
175b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
175c0 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
175d0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
175e0 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
175f0 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
17600 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
17610 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
17620 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
17630 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
17640 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
17650 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
17660 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
17670 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
17680 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
17690 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
176a0 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
176b0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
176c0 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
176d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
176e0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
176f0 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
17700 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
17710 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
17720 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
17730 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
17740 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
17750 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
17760 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
17770 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
17780 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
17790 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
177a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
177b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
177c0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
177d0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  no);.  }.  asser
177e0 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42  t( pPg || !MEMDB
177f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17800 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
17810 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d  GER_OPEN || pPg=
17820 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
17830 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE(("PLAYBACK %d
17840 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
17850 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  8x) %s\n",.     
17860 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
17870 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
17880 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
17890 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
178a0 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20  8*)aData),.     
178b0 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e        (isMainJrn
178c0 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22  l?"main-journal"
178d0 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a  :"sub-journal").
178e0 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61    ));.  if( isMa
178f0 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73  inJrnl ){.    is
17900 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
17910 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66  >noSync || (*pOf
17920 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e  fset <= pPager->
17930 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
17940 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63  else{.    isSync
17950 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20  ed = (pPg==0 || 
17960 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  0==(pPg->flags &
17970 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
17980 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  ));.  }.  if( is
17990 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
179a0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
179b0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
179c0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
179d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
179e0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20  GER_OPEN).   && 
179f0 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20  isSynced.  ){.  
17a00 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67    i64 ofst = (pg
17a10 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
17a20 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
17a30 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61   testcase( !isSa
17a40 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20  vepnt && pPg!=0 
17a50 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  && (pPg->flags&P
17a60 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
17a70 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
17a80 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
17a90 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63  Pager) );.    rc
17aa0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
17ab0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
17ac0 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
17ad0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
17ae0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
17af0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
17b00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
17b10 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
17b20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
17b30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
17b40 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
17b50 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
17b60 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
17b70 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
17b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
17b90 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
17ba0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
17bb0 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
17bc0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
17bd0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
17be0 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
17bf0 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
17c00 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
17c10 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
17c20 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
17c30 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
17c40 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
17c50 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
17c60 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
17c70 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
17c80 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
17c90 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
17ca0 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
17cb0 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
17cc0 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
17cd0 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
17ce0 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
17cf0 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
17d00 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
17d10 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
17d20 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
17d30 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
17d40 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
17d50 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
17d60 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
17d70 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
17d80 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
17d90 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
17da0 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
17db0 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
17dc0 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
17dd0 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
17de0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
17df0 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17e00 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
17e10 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
17e20 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17e30 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
17e40 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
17e50 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
17e60 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17e70 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
17e80 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
17e90 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
17ea0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
17eb0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
17ec0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
17ed0 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
17ee0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
17ef0 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
17f00 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
17f10 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
17f20 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
17f30 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
17f40 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
17f50 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
17f60 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
17f70 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
17f80 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
17f90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
17fa0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
17fb0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
17fc0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
17fd0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
17fe0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
17ff0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
18000 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18010 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ACK;.    rc = sq
18020 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
18030 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
18040 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73  &pPg, 1);.    as
18050 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
18060 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
18070 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21  LFLAG_ROLLBACK)!
18080 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
18090 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
180a0 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  ~SPILLFLAG_ROLLB
180b0 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ACK;.    if( rc!
180c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
180d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d  urn rc;.    pPg-
180e0 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
180f0 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
18100 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18110 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
18120 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
18130 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
18140 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
18150 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
18160 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
18170 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
18180 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
18190 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
181a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
181b0 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
181c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
181d0 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
181e0 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
181f0 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
18200 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
18210 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
18220 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
18230 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
18240 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
18250 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
18260 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
18270 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
18280 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
18290 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
182a0 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
182b0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
182c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
182d0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
182e0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69  (pPg);.    if( i
182f0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
18300 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
18310 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
18320 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
18330 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
18340 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
18350 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
18360 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
18370 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
18380 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
18390 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
183a0 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
183b0 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
183c0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
183d0 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
183e0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
183f0 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
18400 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
18410 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
18420 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
18430 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
18440 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  out to the.     
18450 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
18460 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
18470 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63  There is one exc
18480 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  eption to this r
18490 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ule. If the page
184a0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
184b0 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61  .      ** back a
184c0 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65  s part of a save
184d0 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d  point (or statem
184e0 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72  ent) rollback fr
184f0 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  om an .      ** 
18500 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
18510 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
18520 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
18530 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20  it is not safe. 
18540 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20       ** to mark 
18550 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
18560 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  n. This is becau
18570 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70  se marking the p
18580 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  age as.      ** 
18590 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72  clean will clear
185a0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
185b0 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65  SYNC flag. Since
185c0 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20   the page is.   
185d0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e     ** already in
185e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
185f0 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50  e (recorded in P
18600 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ager.pInJournal)
18610 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
18620 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
18630 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65  C flag is cleare
18640 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  d, if the page i
18650 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  s written to.   
18660 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
18670 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
18680 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
18690 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
186a0 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  but.      ** the
186b0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
186c0 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62   flag will not b
186d0 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20  e set. It could 
186e0 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79  then potentially
186f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69  .      ** be wri
18700 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68  tten out into th
18710 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18720 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e  before its journ
18730 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  al file.      **
18740 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63   segment is sync
18750 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f  ed. If a crash o
18760 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20  ccurs during or 
18770 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a  following this,.
18780 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
18790 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  e corruption may
187a0 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f   ensue..      */
187b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
187c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
187d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  er) );.      sql
187e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
187f0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
18800 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
18810 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20  gehash(pPg);..  
18820 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
18830 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
18840 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
18850 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
18860 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
18870 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
18880 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
18890 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
188a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
188b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
188c0 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
188d0 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
188e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
188f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
18900 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
18910 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
18920 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
18930 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
18940 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
18950 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
18960 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
18970 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
18980 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18990 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
189a0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
189b0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
189c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
189d0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
189e0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
189f0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
18a00 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18a10 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
18a20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
18a30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
18a40 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
18a50 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
18a60 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18a70 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
18a80 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
18a90 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
18aa0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
18ab0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
18ac0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
18ad0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
18ae0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
18af0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
18b00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
18b10 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
18b20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
18b30 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
18b40 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
18b50 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
18b60 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
18b70 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
18b80 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
18b90 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
18ba0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
18bb0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
18bc0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
18bd0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
18be0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
18bf0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
18c00 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
18c10 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
18c20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
18c30 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
18c40 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
18c50 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
18c60 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
18c70 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
18c80 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
18c90 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
18ca0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
18cb0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
18cc0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
18cd0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
18ce0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
18cf0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
18d00 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
18d10 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
18d20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
18d30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
18d40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
18d50 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
18d60 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
18d70 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
18d80 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
18d90 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
18da0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
18db0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
18dc0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
18dd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18de0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
18df0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
18e00 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18e10 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
18e20 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
18e30 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
18e40 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
18e50 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
18e60 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18e70 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
18e80 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
18e90 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
18ea0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
18eb0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
18ec0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
18ed0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
18ee0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
18ef0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
18f00 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
18f10 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
18f20 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
18f30 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
18f40 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
18f50 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
18f60 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
18f70 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
18f80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18f90 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
18fa0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
18fb0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
18fc0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
18fd0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
18fe0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
18ff0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
19000 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19010 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
19020 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
19030 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
19040 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
19050 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
19060 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
19070 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
19080 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
19090 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
190a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
190b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
190c0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
190d0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
190e0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
190f0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
19100 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
19110 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
19120 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19130 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
19140 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
19150 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
19160 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
19170 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
19180 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
191b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
191c0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
191d0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
191e0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
191f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
19200 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
19210 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
19220 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
19230 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
19240 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
19250 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
19260 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
19270 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19280 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
19290 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
192a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
192b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
192c0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
192d0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
192e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
192f0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
19300 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
19310 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
19320 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
19330 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
19340 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
19350 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19360 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
19370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
19380 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
19390 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
193a0 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
193b0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
193c0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
193d0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
193e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
193f0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
19400 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
19410 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19420 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
19430 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
19440 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
19450 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
19460 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
19470 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
19480 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
19490 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
194a0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
194b0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
194c0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
194d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
194e0 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
194f0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
19500 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
19510 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
19520 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
19530 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
19540 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
19550 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
19560 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
19570 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
19580 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
19590 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
195a0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
195b0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
195c0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
195d0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
195e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
195f0 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
19600 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
19610 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f  ournal.   Also o
19620 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69  btain.  ** suffi
19630 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20  cient space (in 
19640 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68  zMasterPtr) to h
19650 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  old the names of
19660 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75   master.  ** jou
19670 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61  rnal files extra
19680 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61  cted from regula
19690 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  r rollback-journ
196a0 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  als..  */.  rc =
196b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
196c0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
196d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
196e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
196f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19700 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65  er_out;.  nMaste
19710 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50  rPtr = pVfs->mxP
19720 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61  athname+1;.  zMa
19730 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  sterJournal = sq
19740 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73  lite3Malloc(nMas
19750 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
19760 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
19770 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
19780 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
19790 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
197a0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
197b0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
197c0 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
197d0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
197e0 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
197f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
19800 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
19810 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
19820 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
19830 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19840 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
19850 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
19860 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
19870 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
19880 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
19890 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
198a0 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
198b0 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
198c0 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
198d0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
198e0 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
198f0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
19900 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
19910 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
19920 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
19930 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
19950 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19970 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
19980 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
19990 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
199a0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
199b0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
199c0 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
199d0 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
199e0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
199f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
19a00 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
19a10 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
19a20 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
19a30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
19a40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19a50 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
19a60 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
19a70 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
19a80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
19a90 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
19aa0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
19ab0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
19ac0 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
19ad0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
19ae0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19af0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
19b00 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19b10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
19b20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
19b30 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
19b40 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
19b50 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
19b60 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
19b70 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
19b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19b90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
19ba0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19bb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
19bc0 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
19bd0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
19be0 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
19bf0 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
19c00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
19c10 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
19c20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
19c30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19c40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
19c50 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19c60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
19c70 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
19c80 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
19c90 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
19ca0 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
19cb0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
19cc0 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
19cd0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
19ce0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
19cf0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
19d00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
19d10 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
19d20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
19d30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
19d40 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
19d50 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
19d60 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
19d70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
19d80 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
19d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
19da0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19db0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
19dc0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
19dd0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
19de0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
19df0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
19e00 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
19e10 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
19e20 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
19e30 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
19e40 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
19e50 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
19e60 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
19e70 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
19e80 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
19e90 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
19ea0 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
19eb0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
19ec0 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
19ed0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
19ee0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
19ef0 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
19f00 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
19f10 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
19f20 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
19f30 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
19f40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
19f50 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
19f60 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
19f70 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
19f80 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
19f90 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
19fa0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
19fb0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
19fc0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
19fd0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  Or, it might be 
19fe0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
19ff0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
1a000 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
1a010 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
1a020 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
1a030 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
1a040 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
1a050 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
1a060 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
1a070 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
1a080 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
1a090 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
1a0a0 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
1a0b0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
1a0c0 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
1a0d0 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
1a0e0 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
1a0f0 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
1a100 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
1a110 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1a120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
1a130 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1a140 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
1a150 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
1a160 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
1a170 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
1a180 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1a190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1a1a0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
1a1b0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1a1c0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
1a1d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a1e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a1f0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
1a200 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
1a210 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1a220 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
1a230 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
1a240 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
1a250 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1a260 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1a270 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1a280 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1a290 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
1a2a0 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
1a2b0 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
1a2c0 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
1a2d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1a2e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a2f0 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
1a300 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
1a310 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
1a320 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
1a330 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
1a340 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
1a350 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1a360 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
1a370 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
1a380 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a  ewSize = szPage*
1a390 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
1a3a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a3b0 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
1a3c0 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
1a3d0 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
1a3e0 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
1a3f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a400 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
1a410 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
1a420 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1a430 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b  f( (currentSize+
1a440 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65  szPage)<=newSize
1a450 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1a460 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d   *pTmp = pPager-
1a470 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1a480 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c      memset(pTmp,
1a490 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20   0, szPage);.   
1a4a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1a4b0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
1a4c0 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  == currentSize )
1a4d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a4e0 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
1a4f0 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53  age) >  currentS
1a500 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ize );.        r
1a510 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1a520 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
1a530 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77  Tmp, szPage, new
1a540 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20  Size-szPage);.  
1a550 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a570 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1a580 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
1a590 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
1a5a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a5b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1a5c0 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20  urn a sanitized 
1a5d0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
1a5e0 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53  ector-size of OS
1a5f0 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65   file pFile. The
1a600 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1a610 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1a620 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32  o lie between 32
1a630 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f   and MAX_SECTOR_
1a640 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  SIZE..*/.int sql
1a650 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73  ite3SectorSize(s
1a660 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1a670 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20  le){.  int iRet 
1a680 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
1a690 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20  rSize(pFile);.  
1a6a0 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20  if( iRet<32 ){. 
1a6b0 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20     iRet = 512;. 
1a6c0 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e   }else if( iRet>
1a6d0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1a6e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
1a6f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
1a700 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20  512 );.    iRet 
1a710 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
1a720 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
1a730 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  iRet;.}../*.** S
1a740 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1a750 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
1a760 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
1a770 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
1a780 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
1a790 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1a7a0 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1a7b0 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
1a7c0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1a7d0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
1a7e0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1a7f0 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
1a800 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1a810 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
1a820 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1a830 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
1a840 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
1a850 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
1a860 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1a870 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
1a880 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
1a890 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a8a0 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
1a8b0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
1a8c0 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
1a8d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
1a8e0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1a8f0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
1a900 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1a910 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1a920 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
1a930 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
1a940 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
1a950 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
1a960 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
1a970 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
1a980 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
1a990 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
1a9a0 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  R_SIZE..**.** If
1a9b0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68   the file has th
1a9c0 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  e SQLITE_IOCAP_P
1a9d0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a9e0 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  TE property, the
1a9f0 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66  n set.** the eff
1aa00 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1aa10 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  ze to its minimu
1aa20 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20  m value (512).  
1aa30 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a  The purpose of.*
1aa40 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  * pPager->sector
1aa50 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e  Size is to defin
1aa60 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64  e the "blast rad
1aa70 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68  ius" of bytes th
1aa80 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1aa90 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63  ge if a crash oc
1aaa0 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69  curs while writi
1aab0 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62  ng to a single b
1aac0 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72  yte in.** that r
1aad0 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20  ange.  But with 
1aae0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1aaf0 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72  ITE, the blast r
1ab00 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a  adius is zero.**
1ab10 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50   (that is what P
1ab20 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1ab30 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65  TE means), so we
1ab40 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65   minimize the se
1ab50 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46  ctor.** size.  F
1ab60 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
1ab70 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68  patibility of th
1ab80 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1ab90 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a  al file format,.
1aba0 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64  ** we cannot red
1abb0 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
1abc0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65  e sector size be
1abd0 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74  low 512..*/.stat
1abe0 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
1abf0 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
1ac00 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
1ac10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ac20 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1ac30 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
1ac40 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1ac50 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  e.   || (sqlite3
1ac60 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1ac70 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1ac80 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20  fd) & .         
1ac90 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1aca0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1acb0 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20  WRITE)!=0.  ){. 
1acc0 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
1acd0 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
1ace0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1acf0 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
1ad00 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
1ad10 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
1ad20 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
1ad30 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
1ad40 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
1ad50 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
1ad60 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ault. */.    pPa
1ad70 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1ad80 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 512;.  }else{.
1ad90 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1ada0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
1adb0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1adc0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r->fd);.  }.}../
1add0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
1ade0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
1adf0 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
1ae00 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
1ae10 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
1ae20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
1ae30 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
1ae40 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
1ae50 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1ae60 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
1ae70 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
1ae80 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
1ae90 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
1aea0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
1aeb0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
1aec0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1aed0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1aee0 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
1aef0 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
1af00 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
1af10 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
1af20 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1af30 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
1af40 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
1af50 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
1af60 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
1af70 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
1af80 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
1af90 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1afa0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
1afb0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
1afc0 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
1afd0 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
1afe0 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
1aff0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b000 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1b010 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
1b020 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
1b030 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
1b040 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
1b050 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1b060 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1b070 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
1b080 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
1b090 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
1b0a0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
1b0b0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
1b0c0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1b0d0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1b0e0 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
1b0f0 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
1b100 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
1b110 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
1b120 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
1b130 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
1b140 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
1b150 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
1b160 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1b170 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
1b180 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
1b190 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1b1a0 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
1b1b0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1b1c0 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
1b1d0 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
1b1e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1b1f0 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
1b200 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
1b210 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
1b220 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
1b230 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
1b240 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
1b250 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
1b260 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
1b270 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
1b280 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
1b290 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1b2a0 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
1b2b0 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
1b2c0 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
1b2d0 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
1b2e0 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
1b2f0 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
1b300 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1b310 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
1b320 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
1b330 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
1b340 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
1b350 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
1b360 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
1b370 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
1b380 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b390 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1b3a0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
1b3b0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
1b3c0 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
1b3d0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
1b3e0 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
1b3f0 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
1b400 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
1b410 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
1b420 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
1b430 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
1b440 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
1b450 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
1b460 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
1b470 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1b480 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1b490 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
1b4a0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1b4b0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
1b4c0 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
1b4d0 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
1b4e0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
1b4f0 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
1b500 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
1b510 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
1b520 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
1b530 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
1b540 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
1b550 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
1b560 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
1b570 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
1b580 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
1b590 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b5a0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
1b5b0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
1b5c0 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
1b5d0 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
1b5e0 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
1b5f0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1b600 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
1b610 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
1b620 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
1b630 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
1b640 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
1b650 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
1b660 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
1b670 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
1b680 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
1b690 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1b6a0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
1b6b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1b6c0 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
1b6d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1b6e0 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
1b6f0 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
1b700 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
1b710 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
1b720 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
1b730 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
1b740 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
1b750 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
1b760 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
1b770 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1b780 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
1b790 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
1b7a0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1b7b0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
1b7c0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
1b7d0 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
1b7e0 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
1b7f0 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
1b800 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
1b810 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
1b820 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
1b830 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
1b840 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
1b850 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
1b860 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1b870 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
1b880 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
1b890 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
1b8a0 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
1b8b0 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
1b8c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
1b8d0 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
1b8e0 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
1b8f0 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
1b900 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
1b910 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1b920 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
1b930 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1b940 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1b950 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b970 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
1b980 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
1b990 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
1b9c0 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
1b9d0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1ba00 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1ba10 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
1ba20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ba30 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1ba40 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
1ba50 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba70 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
1ba80 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1ba90 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
1baa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1bab0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1bac0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
1bad0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
1bae0 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
1baf0 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
1bb00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1bb10 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
1bb20 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
1bb30 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
1bb40 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
1bb50 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
1bb60 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e  lback */.  int n
1bb70 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20  Playback = 0;   
1bb80 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1bb90 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73  ber of pages res
1bba0 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e  tored from journ
1bbb0 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  al */..  /* Figu
1bbc0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1bbd0 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
1bbe0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
1bbf0 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
1bc00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1bc10 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
1bc20 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1bc30 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
1bc40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1bc50 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1bc60 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
1bc70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bc80 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1bc90 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
1bca0 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
1bcb0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
1bcc0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1bcd0 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
1bce0 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
1bcf0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1bd00 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
1bd10 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
1bd20 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
1bd30 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
1bd40 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
1bd50 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
1bd60 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1bd70 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
1bd80 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
1bd90 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
1bda0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1bdb0 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
1bdc0 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
1bdd0 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
1bde0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
1bdf0 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
1be00 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
1be10 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
1be20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
1be30 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
1be40 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1be50 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
1be60 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
1be70 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1be80 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1be90 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1bea0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1beb0 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1bec0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1bed0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1bee0 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1bef0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1bf00 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1bf10 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1bf20 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1bf30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf40 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1bf50 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1bf60 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1bf70 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1bf80 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1bf90 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1bfa0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1bfb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bfc0 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1bfd0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1bfe0 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1bff0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1c000 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1c010 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1c020 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1c030 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1c040 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1c050 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1c060 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1c070 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1c080 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1c090 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1c0a0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1c0b0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1c0c0 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1c0d0 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1c0e0 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1c0f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1c100 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1c110 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1c120 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1c130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1c140 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1c150 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1c160 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1c170 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1c180 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1c190 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1c1a0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1c1b0 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1c1c0 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1c1d0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1c1e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1c1f0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1c200 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1c210 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1c220 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c230 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1c240 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1c250 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1c260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c270 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1c280 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c290 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1c2a0 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1c2b0 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1c2c0 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1c2d0 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1c2e0 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1c2f0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1c300 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1c310 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1c320 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1c330 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1c340 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1c350 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1c360 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1c370 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1c380 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1c390 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1c3a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1c3b0 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1c3c0 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1c3d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1c3e0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1c3f0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1c400 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1c410 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1c420 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c430 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1c440 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1c450 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1c460 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1c470 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1c480 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1c490 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1c4a0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1c4b0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1c4c0 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1c4d0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1c4e0 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1c4f0 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1c500 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1c510 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1c520 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1c530 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1c540 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1c550 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1c560 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1c570 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1c580 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1c590 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1c5a0 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1c5b0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1c5c0 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1c5d0 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1c5e0 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1c5f0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1c600 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1c610 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1c620 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1c630 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1c640 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1c650 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1c660 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1c670 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1c680 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1c690 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1c6a0 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1c6b0 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1c6c0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1c6d0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1c6e0 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1c6f0 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1c700 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1c710 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1c720 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1c730 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1c740 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1c750 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1c760 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1c770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1c780 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1c790 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1c7a0 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1c7b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1c7c0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1c7d0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1c7e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1c7f0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1c800 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1c810 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1c820 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1c830 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1c840 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1c850 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1c860 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1c870 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1c880 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1c890 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1c8a0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1c8b0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1c8c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1c8d0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1c8e0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1c8f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1c900 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1c910 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1c920 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c940 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c950 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c960 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1c970 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1c980 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1c990 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1c9a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1c9b0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1c9c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1c9d0 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1c9e0 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1c9f0 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1ca00 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1ca10 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1ca20 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1ca30 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1ca40 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1ca50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1ca60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1ca70 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1ca80 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1ca90 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1caa0 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1cab0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1cad0 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20  nPlayback++;.   
1cae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1caf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cb00 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1cb10 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cb20 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1cb30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1cb40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cb50 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1cb60 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1cb70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1cb80 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1cb90 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1cba0 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1cbb0 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1cbc0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1cbd0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1cbe0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1cbf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1cc00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1cc10 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1cc20 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1cc30 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1cc40 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1cc50 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1cc60 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1cc70 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1cc80 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1cc90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1cca0 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1ccb0 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1ccc0 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1ccd0 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1cce0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1ccf0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1cd00 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1cd10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1cd20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1cd30 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1cd40 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1cd50 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1cd60 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1cd70 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1cd80 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1cd90 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1cda0 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1cdb0 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1cdc0 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1cdd0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1cde0 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1cdf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1ce00 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1ce10 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1ce20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1ce30 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1ce40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1ce50 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ce60 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1ce70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ce80 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1ce90 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1cea0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1ceb0 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1cec0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1ced0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1cee0 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1cef0 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1cf00 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1cf10 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1cf20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1cf30 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1cf40 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1cf50 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1cf60 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1cf70 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1cf80 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1cf90 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cfa0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1cfb0 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64  ified..  */.#ifd
1cfc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1cfd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
1cfe0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1cff0 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1d000 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
1d010 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
1d020 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
1d030 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
1d040 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
1d050 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
1d060 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
1d070 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1d080 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
1d090 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
1d0a0 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
1d0b0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1d0c0 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
1d0d0 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
1d0e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d0f0 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
1d100 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
1d110 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
1d120 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
1d130 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
1d140 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
1d150 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
1d160 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
1d170 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
1d180 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
1d190 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
1d1a0 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
1d1b0 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
1d1c0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d1d0 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
1d1e0 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
1d1f0 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
1d200 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
1d210 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1d220 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1d230 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
1d240 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
1d250 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
1d260 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
1d270 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1d280 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
1d290 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1d2a0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1d2b0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1d2c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d2d0 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
1d2e0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1d2f0 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
1d300 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1d310 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1d320 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1d330 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1d340 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1d350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d360 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1d370 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
1d380 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1d390 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1d3a0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1d3b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1d3c0 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  EN).  ){.    rc 
1d3d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1d3e0 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  nc(pPager, 0);. 
1d3f0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1d400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1d410 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1d420 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
1d430 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
1d440 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63  ', 0);.    testc
1d450 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d460 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d480 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
1d490 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
1d4a0 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
1d4b0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
1d4c0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1d4d0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
1d4e0 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
1d4f0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1d500 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1d510 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
1d520 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1d530 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
1d540 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1d550 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1d560 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1d570 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20  .  if( isHot && 
1d580 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20  nPlayback ){.   
1d590 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
1d5a0 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
1d5b0 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65  ER_ROLLBACK, "re
1d5c0 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73  covered %d pages
1d5d0 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20   from %s",.     
1d5e0 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79             nPlay
1d5f0 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  back, pPager->zJ
1d600 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20  ournal);.  }..  
1d610 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
1d620 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1d630 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
1d640 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
1d650 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
1d660 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
1d670 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
1d680 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
1d690 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
1d6a0 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
1d6b0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
1d6c0 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
1d6d0 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
1d6e0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
1d6f0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
1d700 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
1d710 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72   the content for
1d720 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
1d730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d740 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20  le and into .** 
1d750 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68  pPg->pData. A sh
1d760 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ared lock or gre
1d770 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
1d780 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1d790 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65  e.** file before
1d7a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1d7b0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
1d7c0 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61  If page 1 is rea
1d7d0 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  d, then the valu
1d7e0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
1d7f0 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74  eVers[] is set t
1d800 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  o.** the value r
1d810 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
1d820 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1d830 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
1d840 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1d850 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65  e IO error is re
1d860 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1d870 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ller..** Otherwi
1d880 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
1d890 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1d8a0 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
1d8b0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20  age(PgHdr *pPg, 
1d8c0 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50  u32 iFrame){.  P
1d8d0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1d8e0 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
1d8f0 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
1d900 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1d910 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
1d920 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1d930 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1d940 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
1d950 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d960 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1d970 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1d980 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  /.  int pgsz = p
1d990 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1d9a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1d9b0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a  tes to read */..
1d9c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d9d0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1d9e0 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42  READER && !MEMDB
1d9f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
1da00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1da10 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1da20 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69  ITE_OMIT_WAL.  i
1da30 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20  f( iFrame ){.   
1da40 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20   /* Try to pull 
1da50 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1da60 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  e write-ahead lo
1da70 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
1da80 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61  qlite3WalReadFra
1da90 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1daa0 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70   iFrame, pgsz, p
1dab0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65  Pg->pData);.  }e
1dac0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
1dad0 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d     i64 iOffset =
1dae0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
1daf0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1db00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1db10 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1db20 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  fd, pPg->pData, 
1db30 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a  pgsz, iOffset);.
1db40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1db50 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1db60 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
1db70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1db80 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67   }.  }..  if( pg
1db90 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  no==1 ){.    if(
1dba0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
1dbb0 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75  If the read is u
1dbc0 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74  nsuccessful, set
1dbd0 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b   the dbFileVers[
1dbe0 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20  ] to something. 
1dbf0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c       ** that wil
1dc00 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c  l never be a val
1dc10 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e  id file version.
1dc20 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69    dbFileVers[] i
1dc30 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a  s a copy.      *
1dc40 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33  * of bytes 24..3
1dc50 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1dc60 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31  e.  Bytes 28..31
1dc70 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1dc80 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  e.      ** zero 
1dc90 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
1dca0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1dcb0 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33  age. Bytes 32..3
1dcc0 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20  5 and 35..39.   
1dcd0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1dce0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69  page numbers whi
1dcf0 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66  ch are never 0xf
1dd00 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c  fffffff.  So fil
1dd10 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50  ling.      ** pP
1dd20 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1dd30 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66  [] with all 0xff
1dd40 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75   bytes should su
1dd50 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  ffice..      **.
1dd60 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20        ** For an 
1dd70 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
1dd80 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f  se, the situatio
1dd90 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  n is more comple
1dda0 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20  x:  bytes.      
1ddb0 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  ** 24..39 of the
1ddc0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68   database are wh
1ddd0 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20  ite noise.  But 
1dde0 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
1ddf0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74  of.      ** whit
1de00 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67  e noise equaling
1de10 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1de20 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1de30 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1de40 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1de50 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1de60 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1de70 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1de80 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1de90 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1dea0 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1deb0 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1dec0 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1ded0 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1dee0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1def0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1df00 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1df10 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1df20 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1df30 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1df40 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1df50 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d  a, pgno, 3, rc =
1df60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
1df70 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1df80 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1df90 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1dfa0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1dfb0 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1dfc0 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1dfd0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1dfe0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1dff0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1e000 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1e010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e020 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e030 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1e040 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1e050 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e060 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1e070 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1e080 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1e090 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1e0a0 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1e0b0 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1e0c0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1e0d0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1e0e0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1e0f0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1e100 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1e110 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1e120 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1e130 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1e140 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1e150 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1e160 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1e170 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1e180 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1e190 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1e1a0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1e1b0 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1e1c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e1d0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1e1e0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1e1f0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1e200 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1e210 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1e220 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1e230 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1e240 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1e250 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1e260 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1e270 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1e280 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e290 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1e2a0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1e2b0 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1e2c0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1e2d0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1e2e0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1e2f0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1e300 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1e310 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1e320 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1e330 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1e340 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1e350 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1e360 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1e370 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1e380 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1e390 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1e3a0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e3b0 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1e3c0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1e3d0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1e3e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e3f0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1e400 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1e410 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1e420 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1e430 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1e440 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e450 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1e460 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1e470 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1e480 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1e490 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1e4a0 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1e4b0 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1e4c0 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1e4d0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1e4e0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1e4f0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1e500 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1e510 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1e520 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1e530 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1e540 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1e550 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1e560 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1e570 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1e580 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1e590 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1e5a0 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1e5b0 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1e5c0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1e5d0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1e5e0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1e5f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e600 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1e610 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1e620 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1e630 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1e640 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1e650 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1e660 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1e670 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1e680 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1e6a0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1e6b0 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1e6c0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1e6d0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1e6e0 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1e6f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1e700 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1e710 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1e720 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1e730 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1e740 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1e750 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1e760 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1e770 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
1e780 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  iFrame = 0;.    
1e790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e7a0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e7b0 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e7c0 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e7d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e7e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e7f0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e800 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
1e810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e830 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1e840 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1e850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e860 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e870 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  fNotNull(pPg);. 
1e880 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1e890 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1e8a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1e8b0 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1e8c0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1e8d0 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1e8e0 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1e8f0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1e900 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1e910 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1e920 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1e930 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1e940 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1e950 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1e960 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1e970 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1e980 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1e990 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1e9a0 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1e9b0 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1e9c0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1e9d0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1e9e0 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1e9f0 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1ea00 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1ea10 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1ea20 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1ea30 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1ea40 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1ea50 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1ea60 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1ea70 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1ea80 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1ea90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1eaa0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1eab0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1eac0 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1ead0 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1eae0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1eaf0 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1eb00 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1eb10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1eb20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1eb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1eb40 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1eb50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb70 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1eb80 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1eb90 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1eba0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1ebb0 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1ebc0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1ebd0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1ebe0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1ebf0 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1ec00 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1ec10 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1ec20 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1ec30 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1ec40 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1ec50 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1ec60 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1ec70 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1ec80 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1ec90 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1eca0 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1ecb0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1ecc0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1ecd0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1ece0 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1ecf0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1ed00 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1ed10 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1ed20 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1ed30 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1ed40 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1ed50 68 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  he);..#ifndef SQ
1ed60 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
1ed70 52 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 69  RENT.  /* If thi
1ed80 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45  s is an CONCURRE
1ed90 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  NT transaction, 
1eda0 74 68 65 6e 20 70 61 67 65 20 31 20 6d 75 73 74  then page 1 must
1edb0 20 62 65 20 72 65 72 65 61 64 20 66 72 6f 6d 20   be reread from 
1edc0 0a 20 20 2a 2a 20 74 68 65 20 64 62 20 66 69 6c  .  ** the db fil
1edd0 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69 73  e, even if it is
1ede0 20 6e 6f 74 20 64 69 72 74 79 2e 20 54 68 69 73   not dirty. This
1edf0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
1ee00 62 2d 74 72 65 65 20 6c 61 79 65 72 20 0a 20 20  b-tree layer .  
1ee10 2a 2a 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65  ** may have alre
1ee20 61 64 79 20 7a 65 72 6f 65 64 20 74 68 65 20 6e  ady zeroed the n
1ee30 46 72 65 65 20 61 6e 64 20 69 54 72 75 6e 6b 20  Free and iTrunk 
1ee40 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 20  header fields.  
1ee50 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1ee60 49 54 45 5f 4f 4b 20 26 26 20 28 70 4c 69 73 74  ITE_OK && (pList
1ee70 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67  ==0 || pList->pg
1ee80 6e 6f 21 3d 31 29 20 26 26 20 70 50 61 67 65 72  no!=1) && pPager
1ee90 2d 3e 70 41 6c 6c 52 65 61 64 20 29 7b 0a 20 20  ->pAllRead ){.  
1eea0 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1eeb0 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 2a 29  Callback((void*)
1eec0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 7d 0a  pPager, 1);.  }.
1eed0 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28  #endif..  while(
1eee0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1eef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1ef00 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1ef10 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1ef20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1ef30 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1ef40 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1ef50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1ef60 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1ef70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ef80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ef90 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1efa0 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1efb0 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1efc0 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1efd0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1efe0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1eff0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1f000 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1f010 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1f020 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1f030 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1f040 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1f050 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1f060 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1f070 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1f080 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1f090 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1f0a0 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1f0b0 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1f0c0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1f0d0 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1f0e0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1f0f0 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1f100 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1f110 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1f120 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1f130 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1f160 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1f170 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f180 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f190 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1f1a0 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1f1b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f1c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1f1d0 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1f1e0 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1f1f0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1f200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f210 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1f220 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  commit */.){.  i
1f230 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f250 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1f260 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20  .  int nList;   
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f280 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f290 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a  pages in pList *
1f2a0 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  /.  PgHdr *p;   
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2c0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1f2d0 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f  ng over pages */
1f2e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1f2f0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1f300 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1f310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1f320 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1f330 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1f340 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1f350 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1f360 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1f370 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1f380 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1f390 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1f3a0 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1f3b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1f3c0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44  ssert( pList->pD
1f3d0 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d  irty==0 || isCom
1f3e0 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43  mit );.  if( isC
1f3f0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1f400 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1f410 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1f420 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1f430 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1f440 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1f450 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1f460 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1f470 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1f480 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1f490 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1f4a0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1f4b0 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1f4c0 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1f4d0 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1f4e0 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1f4f0 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1f500 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1f510 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b  ;.    nList = 0;
1f520 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1f530 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21  ; (*ppNext = p)!
1f540 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  =0; p=p->pDirty)
1f550 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1f560 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29  gno<=nTruncate )
1f570 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74  {.        ppNext
1f580 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20   = &p->pDirty;. 
1f590 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a         nList++;.
1f5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f5b0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1f5c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f5d0 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  nList = 1;.  }. 
1f5e0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
1f5f0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
1f600 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66   += nList;..  if
1f610 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
1f620 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
1f630 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
1f640 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  st);.  rc = sqli
1f650 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
1f660 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
1f670 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1f680 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
1f690 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
1f6a0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
1f6b0 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
1f6c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f6d0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
1f6e0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   ){.    for(p=pL
1f6f0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1f700 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
1f710 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1f720 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1f730 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
1f740 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
1f750 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
1f760 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1f770 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1f780 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1f790 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f7a0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
1f7b0 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1f7c0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  ){.    pager_set
1f7d0 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
1f7e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1f7f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f800 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
1f810 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1f820 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
1f830 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
1f840 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
1f850 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
1f860 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
1f870 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
1f880 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
1f890 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
1f8a0 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
1f8b0 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
1f8c0 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
1f8d0 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
1f8e0 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
1f8f0 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
1f900 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
1f910 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
1f920 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
1f930 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1f940 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
1f950 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
1f960 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1f970 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f990 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1f9a0 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
1f9b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f9c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1f9d0 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
1f9e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1f9f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1fa00 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1fa10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1fa20 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
1fa30 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1fa40 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
1fa50 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
1fa60 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1fa70 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
1fa80 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
1fa90 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
1faa0 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
1fab0 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
1fac0 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
1fad0 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
1fae0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1faf0 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
1fb00 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
1fb10 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
1fb20 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
1fb30 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
1fb40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
1fb50 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1fb60 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1fb70 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
1fb80 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
1fb90 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1fba0 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
1fbb0 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
1fbc0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
1fbd0 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
1fbe0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1fbf0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
1fc00 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
1fc10 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
1fc20 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
1fc30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1fc40 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1fc50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1fc60 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
1fc70 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
1fc80 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
1fc90 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
1fca0 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
1fcb0 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1fcc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fcd0 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
1fce0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
1fcf0 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
1fd00 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
1fd10 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
1fd20 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
1fd30 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
1fd40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1fd50 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1fd60 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1fd70 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
1fd80 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
1fd90 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1fda0 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
1fdb0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1fdc0 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
1fdd0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
1fde0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1fdf0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1fe00 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1fe10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1fe20 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
1fe30 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1fe60 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
1fe70 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
1fe80 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1fe90 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1fea0 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
1feb0 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
1fec0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
1fed0 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
1fee0 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
1fef0 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
1ff00 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
1ff10 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1ff20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
1ff30 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ff40 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
1ff50 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1ff60 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
1ff70 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
1ff80 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
1ff90 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
1ffa0 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
1ffb0 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
1ffc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ffd0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1ffe0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1fff0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
20000 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
20010 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
20020 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72  WalDbsize(pPager
20030 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49  ->pWal);..  /* I
20040 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
20050 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
20060 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61  abase is not ava
20070 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a  ilable from the.
20080 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73    ** WAL sub-sys
20090 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  tem, determine t
200a0 68 65 20 70 61 67 65 20 63 6f 75 6e 74 65 20 62  he page counte b
200b0 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65  ased on the size
200c0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   of.  ** the dat
200d0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
200e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
200f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20100 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74   not an.  ** int
20110 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
20120 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
20130 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72 65 73  round up the res
20140 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
20150 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
20160 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20180 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
20190 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
201a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
201b0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
201c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
201d0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
201e0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
201f0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
20200 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
20210 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
20220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20240 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20260 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
20270 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67  )((n+pPager->pag
20280 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65  eSize-1) / pPage
20290 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
202a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
202b0 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
202c0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
202d0 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
202e0 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66  an the.  ** conf
202f0 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
20300 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
20310 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
20320 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
20330 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
20340 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
20350 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
20360 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
20370 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
20380 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
20390 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
203a0 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
203b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
203c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
203d0 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65  IT_WAL./*.** Che
203e0 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
203f0 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
20400 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
20410 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
20420 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
20430 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20440 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
20450 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
20460 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
20470 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
20480 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
20490 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
204a0 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
204b0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
204c0 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
204d0 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
204e0 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
204f0 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
20500 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
20510 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
20520 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
20530 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
20540 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
20550 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
20560 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
20570 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
20580 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
20590 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
205a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
205b0 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
205c0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
205d0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f  e caller must ho
205e0 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ld a SHARED lock
205f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20600 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   file to call th
20610 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
20620 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55  Because an EXCLU
20630 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
20640 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75   db file is requ
20650 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a  ired to delete .
20660 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f  ** a WAL on a no
20670 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73  ne-empty databas
20680 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
20690 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
206a0 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62   condition .** b
206b0 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
206c0 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61  ss() below and a
206d0 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
206e0 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
206f0 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e  me .** other con
20700 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
20710 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
20720 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
20730 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20740 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20750 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
20760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
20770 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
20780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
20790 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
207a0 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
207b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
207c0 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
207f0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
20800 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20820 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20830 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
20840 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
20850 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
20860 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
20870 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
20880 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
20890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
208a0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
208b0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
208c0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
208d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
208e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
208f0 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d  ETE_NOENT ) rc =
20900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20910 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20    isWal = 0;.   
20920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
20930 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
20940 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ss(.          pP
20950 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
20960 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
20970 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
20980 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a  &isWal.      );.
20990 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
209a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
209b0 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
209c0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
209d0 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  se( sqlite3Pcach
209e0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
209f0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
20a00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
20a10 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
20a20 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
20a30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
20a40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20a50 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
20a60 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
20a70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
20a80 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
20a90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
20aa0 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
20ab0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20ac0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
20ad0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
20ae0 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
20af0 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
20b00 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
20b10 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
20b20 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
20b30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
20b40 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
20b50 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
20b60 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
20b70 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
20b80 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
20b90 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
20ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
20bb0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
20bc0 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
20bd0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
20be0 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
20bf0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
20c00 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
20c10 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
20c20 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
20c30 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
20c40 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
20c50 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
20c60 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
20c70 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
20c80 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
20c90 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
20ca0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
20cb0 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
20cc0 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
20cd0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
20ce0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20cf0 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
20d00 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20d10 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
20d20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
20d30 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
20d40 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
20d50 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20d60 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
20d70 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
20d80 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20d90 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
20da0 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
20db0 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
20dc0 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
20dd0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
20de0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
20df0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
20e00 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20e10 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
20e20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
20e30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
20e40 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
20e50 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
20e60 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
20e70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
20e80 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
20e90 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
20ea0 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
20eb0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20ec0 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
20ed0 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
20ee0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
20ef0 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
20f00 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
20f10 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
20f20 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
20f30 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
20f40 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
20f50 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
20f60 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
20f70 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
20f80 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
20f90 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
20fa0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
20fb0 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
20fc0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
20fd0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
20fe0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
20ff0 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
21000 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
21010 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
21020 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
21030 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
21040 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
21050 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
21060 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
21070 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
21080 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
21090 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
210a0 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
210b0 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
210c0 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
210d0 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
210e0 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
210f0 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
21100 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
21110 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
21120 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
21130 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
21140 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
21150 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
21160 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
21170 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
21180 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
21190 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
211a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
211b0 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
211c0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
211d0 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
211e0 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
211f0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
21200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
21210 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
21220 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21230 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
21240 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
21250 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
21260 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
21270 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
21280 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
21290 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
212a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
212b0 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
212c0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
212d0 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
212e0 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
212f0 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
21300 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21310 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
21320 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
21330 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
21340 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
21350 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  CKED );..  /* Al
21360 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
21370 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
21380 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
21390 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
213a0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
213b0 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
213c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
213d0 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
213e0 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
213f0 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
21400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
21410 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
21420 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
21430 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
21440 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
21450 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
21460 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
21470 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
21480 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
21490 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
214a0 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
214b0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
214c0 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
214d0 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
214e0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
214f0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
21500 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
21510 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
21520 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
21540 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
21550 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
21560 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
21570 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
21580 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
21590 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
215a0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
215b0 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
215c0 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
215d0 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
215e0 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
215f0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
21600 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
21610 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
21620 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
21630 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
21640 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
21650 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
21660 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
21670 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
21680 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
21690 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
216a0 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
216b0 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
216c0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
216d0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
216e0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
216f0 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
21700 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
21710 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
21720 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
21730 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
21740 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
21750 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
21760 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
21770 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
21780 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
21790 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
217a0 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
217b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
217c0 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
217d0 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
217e0 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
217f0 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
21800 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
21810 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
21820 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
21830 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
21840 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21850 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
21860 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
21870 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
21880 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
21890 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
218a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
218b0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
218c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
218d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
218e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
218f0 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
21900 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
21910 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21920 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21940 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21950 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21960 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21970 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
21980 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21990 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
219a0 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
219b0 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
219c0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
219d0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
219e0 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
219f0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
21a00 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
21a10 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
21a20 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
21a30 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
21a40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
21a50 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
21a60 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
21a70 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
21a80 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
21a90 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
21aa0 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
21ab0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21ac0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
21ad0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
21ae0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
21af0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21b00 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21b10 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
21b20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21b30 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
21b40 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
21b50 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
21b60 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
21b70 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
21b80 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
21b90 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21ba0 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
21bb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
21bc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21bd0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21be0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21bf0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
21c00 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
21c10 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
21c20 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
21c30 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
21c40 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
21c50 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
21c60 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
21c70 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
21c80 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
21c90 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
21ca0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21cb0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21cc0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21cd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
21ce0 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
21cf0 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
21d00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21d10 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
21d20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
21d30 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
21d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21d50 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
21d60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
21d70 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
21d80 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21d90 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21da0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
21db0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
21dc0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
21dd0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21de0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21df0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
21e00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
21e10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
21e20 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
21e30 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
21e40 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
21e50 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
21e60 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
21e70 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
21e80 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
21e90 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21ea0 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
21eb0 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
21ec0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
21ed0 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
21ee0 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
21ef0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
21f00 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
21f10 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21f20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21f30 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
21f40 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
21f50 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
21f60 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
21f70 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
21f80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
21f90 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
21fa0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
21fb0 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
21fc0 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
21fd0 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
21fe0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21ff0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
22000 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
22010 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
22020 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
22030 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22040 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
22050 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
22060 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
22070 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
22080 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
22090 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
220a0 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
220b0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
220c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
220d0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
220e0 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
220f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
22110 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22120 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
22130 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22140 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
22150 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
22160 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
22170 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
22180 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22190 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
221a0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
221b0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
221c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
221d0 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
221e0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
221f0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ge);.}../*.** In
22200 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  voke SQLITE_FCNT
22210 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65  L_MMAP_SIZE base
22220 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
22230 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70   value of szMmap
22240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22250 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
22260 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
22270 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
22280 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73  _MMAP_SIZE>0.  s
22290 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
222a0 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20  = pPager->fd;.  
222b0 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26  if( isOpen(fd) &
222c0 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  & fd->pMethods->
222d0 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20  iVersion>=3 ){. 
222e0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
222f0 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50   sz;.    sz = pP
22300 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20  ager->szMmap;.  
22310 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65    pPager->bUseFe
22320 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20  tch = (sz>0);.  
22330 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
22340 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
22350 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
22360 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26  NTL_MMAP_SIZE, &
22370 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  sz);.  }.#endif.
22380 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
22390 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
223a0 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d   of any memory m
223b0 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74  apping made of t
223c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
223d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
223e0 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
223f0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22400 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
22410 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65  szMmap){.  pPage
22420 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  r->szMmap = szMm
22430 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61  ap;.  pagerFixMa
22440 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
22450 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
22460 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
22470 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
22480 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
22490 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
224a0 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
224b0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
224c0 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
224d0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
224e0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74  *.** Adjust sett
224f0 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
22500 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  r to those speci
22510 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c  fied in the pgFl
22520 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ags parameter..*
22530 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22  *.** The "level"
22540 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41   in pgFlags & PA
22550 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
22560 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f  MASK sets the ro
22570 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74  bustness.** of t
22580 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
22590 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
225a0 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72  crashes or power
225b0 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20   failures by.** 
225c0 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
225d0 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
225e0 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  when writing the
225f0 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
22600 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
22610 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
22620 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
22630 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
22640 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
22650 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
22660 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
22670 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
22680 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
22690 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
226a0 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
226b0 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
226c0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
226d0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
226e0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
226f0 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
22700 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
22710 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
22720 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22730 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
22740 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
22750 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
22760 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
22770 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
22780 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
22790 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
227a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
227c0 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
227d0 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
227e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
227f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22800 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
22810 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
22820 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
22830 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
22840 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
22850 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
22860 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
22870 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
22880 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
22890 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
228a0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
228b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
228c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
228d0 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
228e0 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
228f0 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
22900 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
22910 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
22920 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
22940 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
22950 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
22960 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
22970 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
22980 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
22990 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
229a0 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
229b0 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
229c0 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
229d0 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
229e0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
229f0 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
22a00 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  ck..**.** The ab
22a10 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c  ove is for a rol
22a20 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  lback-journal mo
22a30 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64  de.  For WAL mod
22a40 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73  e, OFF continues
22a50 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74  .** to mean that
22a60 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f   no syncs ever o
22a70 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65  ccur.  NORMAL me
22a80 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
22a90 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72   is synced.** pr
22aa0 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
22ab0 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   of checkpoint a
22ac0 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
22ad0 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e  base file is syn
22ae0 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  ced.** at the co
22af0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20  nclusion of the 
22b00 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
22b10 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
22b20 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77   of the WAL.** w
22b30 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  as written back 
22b40 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
22b50 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20  e.  But no sync 
22b60 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72  operations occur
22b70 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e   for.** an ordin
22b80 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f  ary commit in NO
22b90 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57  RMAL mode with W
22ba0 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20  AL.  FULL means 
22bb0 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20  that the WAL.** 
22bc0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66  file is synced f
22bd0 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f  ollowing each co
22be0 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20  mmit operation, 
22bf0 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  in addition to t
22c00 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f  he.** syncs asso
22c10 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d  ciated with NORM
22c20 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  AL..**.** Do not
22c30 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f   confuse synchro
22c40 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53  nous=FULL with S
22c50 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e  QLITE_SYNC_FULL.
22c60 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
22c70 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20  SYNC_FULL macro 
22c80 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65  means to use the
22c90 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75   MacOSX-style fu
22ca0 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e  ll-fsync.** usin
22cb0 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53  g fcntl(F_FULLFS
22cc0 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59  YNC).  SQLITE_SY
22cd0 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  NC_NORMAL means 
22ce0 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69  to do an.** ordi
22cf0 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c  nary fsync() cal
22d00 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  l.  There is no 
22d10 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
22d20 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  en SQLITE_SYNC_F
22d30 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54  ULL.** and SQLIT
22d40 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e  E_SYNC_NORMAL on
22d50 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72   platforms other
22d60 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42   than MacOSX.  B
22d70 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72  ut the.** synchr
22d80 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75  onous=FULL versu
22d90 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f  s synchronous=NO
22da0 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74  RMAL setting det
22db0 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20  ermines when.** 
22dc0 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74  the xSync primit
22dd0 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e  ive is called an
22de0 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  d is relevant to
22df0 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a   all platforms..
22e00 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
22e10 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
22e20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
22e30 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
22e40 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
22e50 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
22e60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
22e70 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
22e80 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22e90 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a  Flags(.  Pager *
22ea0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
22eb0 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73  * The pager to s
22ec0 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  et safety level 
22ed0 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  for */.  unsigne
22ee0 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f  d pgFlags      /
22ef0 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20  * Various flags 
22f00 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
22f10 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73   level = pgFlags
22f20 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   & PAGER_SYNCHRO
22f30 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73 73  NOUS_MASK;.  ass
22f40 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26  ert( level>=1 &&
22f50 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70   level<=3 );.  p
22f60 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
22f70 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50   (level==1 || pP
22f80 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
22f90 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?1:0;.  pPager->
22fa0 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65  fullSync = (leve
22fb0 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
22fc0 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
22fd0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
22fe0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  oSync ){.    pPa
22ff0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
23000 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
23010 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
23020 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
23030 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46  gFlags & PAGER_F
23040 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20  ULLFSYNC ){.    
23050 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23060 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23070 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  FULL;.    pPager
23080 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
23090 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
230a0 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LL;.  }else if( 
230b0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
230c0 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29  CKPT_FULLFSYNC )
230d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
230e0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
230f0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
23100 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
23110 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23120 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
23130 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23140 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
23150 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
23160 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
23170 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
23180 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
23190 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77  .  }.  pPager->w
231a0 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50  alSyncFlags = pP
231b0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b  ager->syncFlags;
231c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
231d0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
231e0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
231f0 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f  ags |= WAL_SYNC_
23200 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
23210 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73 20  }.  if( pgFlags 
23220 26 20 50 41 47 45 52 5f 43 41 43 48 45 53 50 49  & PAGER_CACHESPI
23230 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  LL ){.    pPager
23240 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
23250 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a  ~SPILLFLAG_OFF;.
23260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
23270 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
23280 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  |= SPILLFLAG_OFF
23290 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
232a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
232b0 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
232c0 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
232d0 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
232e0 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
232f0 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
23300 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
23310 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
23320 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
23330 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
23340 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
23350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
23360 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
23370 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
23380 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
23390 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
233a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
233b0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
233c0 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
233d0 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
233e0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
233f0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
23400 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
23410 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
23420 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
23430 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
23440 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
23450 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
23460 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
23470 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
23480 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
23490 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
234a0 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
234b0 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
234c0 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
234d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
234e0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
234f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
23500 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23510 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
23520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
23530 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
23540 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23550 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
23560 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
23570 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
23580 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
23590 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
235a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
235b0 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
235c0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
235d0 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
235e0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
235f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
23600 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
23610 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
23620 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
23630 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
23640 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
23650 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
23660 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
23670 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
23680 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
23690 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
236a0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
236b0 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
236c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
236d0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
236e0 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
236f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23700 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
23710 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23720 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
23730 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
23740 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
23750 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
23760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
23770 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
23780 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
23790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
237a0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
237b0 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
237c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
237d0 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
237e0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
237f0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
23800 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
23810 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
23820 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
23830 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
23840 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
23850 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
23860 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
23870 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
23880 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
23890 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
238a0 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
238b0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
238c0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
238d0 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
238e0 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
238f0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
23900 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
23910 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
23920 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
23930 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
23940 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
23950 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
23980 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
23990 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
239a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
239b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
239c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
239d0 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
239e0 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
239f0 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
23a00 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
23a10 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
23a20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
23a30 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
23a40 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
23a50 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
23a60 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
23a70 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
23a80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
23a90 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
23aa0 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
23ab0 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
23ac0 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
23ad0 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
23ae0 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
23af0 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
23b00 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
23b10 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
23b20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
23b30 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
23b40 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
23b50 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
23b60 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23b80 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
23b90 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
23ba0 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
23bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
23bc0 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
23bd0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
23be0 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
23bf0 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
23c00 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
23c10 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
23c20 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
23c30 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
23c40 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
23c50 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
23c60 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
23c70 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
23c80 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  Arg;..  if( isOp
23c90 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
23ca0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20  {.    void **ap 
23cb0 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67  = (void **)&pPag
23cc0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
23cd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
23ce0 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28  int(*)(void *))(
23cf0 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61  ap[0]))==xBusyHa
23d00 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73  ndler );.    ass
23d10 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73  ert( ap[1]==pBus
23d20 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20  yHandlerArg );. 
23d30 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
23d40 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
23d50 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
23d60 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52  CNTL_BUSYHANDLER
23d70 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20  , (void *)ap);. 
23d80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
23d90 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
23da0 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
23db0 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
23dc0 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
23dd0 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
23de0 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
23df0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
23e00 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
23e10 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
23e20 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
23e30 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
23e40 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
23e50 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
23e60 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
23e70 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
23e80 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
23e90 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  R, an SQLITE_IOE
23ea0 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20  RR_xxx sub-code 
23eb0 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
23ec0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23ed0 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
23ee0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
23ef0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
23f00 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
23f10 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
23f20 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
23f30 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
23f40 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
23f50 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
23f60 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
23f70 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
23f80 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
23f90 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
23fa0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
23fb0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
23fc0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
23fd0 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
23fe0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
23ff0 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
24000 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
24010 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
24020 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
24030 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
24040 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
24050 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
24060 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
24070 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
24080 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
24090 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
240a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
240b0 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
240c0 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
240d0 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
240e0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
240f0 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
24100 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
24110 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
24120 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
24130 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
24140 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
24150 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
24160 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
24170 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24180 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
24190 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
241a0 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
241b0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
241c0 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
241d0 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
241e0 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
241f0 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
24200 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
24210 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
24220 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
24230 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
24240 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
24250 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
24260 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
24270 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
24280 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
24290 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
242a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
242b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
242c0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
242d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
242e0 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  32 *pPageSize, i
242f0 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
24300 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24310 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  OK;..  /* It is 
24320 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
24330 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74  do a full assert
24340 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68  _pager_state() h
24350 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a  ere, as this.  *
24360 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  * function may b
24370 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
24380 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29  thin PagerOpen()
24390 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61  , before the sta
243a0 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50  te.  ** of the P
243b0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69  ager object is i
243c0 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73  nternally consis
243d0 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tent..  **.  ** 
243e0 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
243f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
24400 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ned an error if 
24410 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
24420 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52   .  ** PAGER_ERR
24430 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69  OR state. But si
24440 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20  nce PAGER_ERROR 
24450 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73  state guarantees
24460 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65   that.  ** there
24470 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
24480 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
24490 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69  e reference, thi
244a0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
244b0 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
244c0 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e  hat case anyhow.
244d0 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67  .  */..  u32 pag
244e0 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
244f0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ze;.  assert( pa
24500 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
24510 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
24520 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
24530 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
24540 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
24550 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
24560 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
24570 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
24580 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
24590 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
245a0 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20  .   && pageSize 
245b0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33  && pageSize!=(u3
245c0 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
245d0 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  ze .  ){.    cha
245e0 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20  r *pNew = NULL; 
245f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24600 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f  ew temp space */
24610 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d  .    i64 nByte =
24620 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   0;..    if( pPa
24630 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
24640 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e  R_OPEN && isOpen
24650 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
24660 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24670 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
24680 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29  ger->fd, &nByte)
24690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
246a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
246b0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63  .      pNew = (c
246c0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
246d0 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
246e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
246f0 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ew ) rc = SQLITE
24700 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20  _NOMEM;.    }.. 
24710 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
24730 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
24740 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
24750 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
24760 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
24770 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
24780 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
24790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
247a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
247b0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
247c0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
247d0 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
247e0 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
247f0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
24800 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65   = (Pgno)((nByte
24810 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67  +pageSize-1)/pag
24820 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
24830 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
24840 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d   pageSize;.    }
24850 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
24860 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65 77  te3PageFree(pNew
24870 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
24880 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  *pPageSize = pPa
24890 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
248a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
248b0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
248c0 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
248d0 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
248e0 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
248f0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
24900 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
24910 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
24920 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
24930 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
24940 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
24950 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72  ager);.    pager
24960 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
24970 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
24980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
24990 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
249a0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
249b0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
249c0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
249d0 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
249e0 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
249f0 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
24a00 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
24a10 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
24a20 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
24a30 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
24a40 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
24a50 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
24a60 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
24a70 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
24a80 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
24a90 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
24aa0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
24ab0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
24ac0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
24ad0 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
24ae0 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
24af0 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
24b00 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
24b10 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
24b20 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
24b30 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
24b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
24b50 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
24b60 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
24b70 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
24b80 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
24b90 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
24ba0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
24bb0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
24bc0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
24bd0 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
24be0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
24bf0 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
24c00 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
24c10 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
24c20 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
24c30 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
24c40 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
24c50 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
24c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
24c70 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
24c80 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
24c90 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
24ca0 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
24cb0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
24cc0 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  age;.  }.  asser
24cd0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24ce0 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e!=PAGER_OPEN );
24cf0 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20        /* Called 
24d00 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67  only by OP_MaxPg
24d10 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  cnt */.  assert(
24d20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e   pPager->mxPgno>
24d30 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
24d40 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63  );  /* OP_MaxPgc
24d50 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73  nt enforces this
24d60 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61   */.  return pPa
24d70 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
24d80 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
24d90 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
24da0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
24db0 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
24dc0 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
24dd0 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
24de0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
24df0 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
24e00 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
24e10 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
24e20 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
24e30 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
24e40 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
24e50 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
24e60 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
24e70 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
24e80 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
24e90 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
24ea0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
24eb0 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
24ec0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24ed0 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
24ee0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
24ef0 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
24f00 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
24f10 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
24f20 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24f30 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
24f40 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
24f50 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
24f60 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
24f70 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
24f80 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
24f90 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24fa0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
24fb0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24fc0 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
24fd0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
24fe0 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
24ff0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
25000 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
25010 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25020 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
25030 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
25040 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
25050 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
25060 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
25070 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
25080 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
25090 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
250a0 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
250b0 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
250c0 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
250d0 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
250e0 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
250f0 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
25100 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
25110 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
25120 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
25130 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
25140 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
25150 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
25160 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
25170 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
25180 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
25190 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
251a0 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
251b0 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
251c0 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
251d0 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
251e0 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
251f0 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
25200 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
25210 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
25220 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
25230 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
25240 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
25250 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
25260 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
25270 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
25280 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
25290 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
252a0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
252b0 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
252c0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
252d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
252e0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
252f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
25300 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
25310 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
25320 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
25330 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
25340 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  le );..  /* This
25350 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
25360 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65   called by btree
25370 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
25380 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  er creating.  **
25390 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
253a0 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f  t.  There has no
253b0 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74  t been an opport
253c0 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74  unity to transit
253d0 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20  ion.  ** to WAL 
253e0 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  mode yet..  */. 
253f0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
25400 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
25410 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
25420 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
25430 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
25440 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
25450 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
25460 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
25470 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
25480 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69  st, N, 0);.    i
25490 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
254a0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
254b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
254c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
254d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
254e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
254f0 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62  ction may only b
25500 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  e called when a 
25510 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
25520 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74   is open on.** t
25530 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74  he pager. It ret
25540 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  urns the total n
25550 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
25560 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
25570 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  **.** However, i
25580 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65  f the file is be
25590 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67  tween 1 and <pag
255a0 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e  e-size> bytes in
255b0 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   size, then .** 
255c0 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72  this is consider
255d0 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65  ed a 1 page file
255e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
255f0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
25600 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25610 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61  nt *pnPage){.  a
25620 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
25630 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
25640 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
25650 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
25660 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
25670 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50  NISHED );.  *pnP
25680 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65  age = (int)pPage
25690 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f  r->dbSize;.}.../
256a0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
256b0 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
256c0 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68  e locktype on th
256d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
256e0 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72   If.** a similar
256f0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
25700 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
25710 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
25720 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72  is a no-op.** (r
25730 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
25740 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  OK immediately).
25750 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
25760 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  , attempt to obt
25770 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ain the lock usi
25780 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  ng sqlite3OsLock
25790 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74  (). Invoke .** t
257a0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
257b0 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
257c0 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
257d0 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20  ailable. Repeat 
257e0 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75  .** until the bu
257f0 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
25800 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  rns false or unt
25810 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  il the attempt t
25820 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65  o .** obtain the
25830 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
25840 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
25850 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
25860 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
25870 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
25880 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
25890 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
258a0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63   is obtained suc
258b0 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74  cessfully, set t
258c0 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a  he Pager.state .
258d0 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c  ** variable to l
258e0 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72  ocktype before r
258f0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
25900 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
25910 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
25920 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
25930 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
25940 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25970 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  /..  /* Check th
25980 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65  at this is eithe
25990 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75  r a no-op (becau
259a0 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  se the requested
259b0 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61   lock is .  ** a
259c0 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72  lready held), or
259d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e   one of the tran
259e0 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65  sitions that the
259f0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20   busy-handler.  
25a00 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65  ** may be invoke
25a10 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64  d during, accord
25a20 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65  ing to the comme
25a30 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71  nt above.  ** sq
25a40 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
25a50 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f  yhandler()..  */
25a60 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
25a70 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74  er->eLock>=lockt
25a80 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ype).       || (
25a90 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
25aa0 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  O_LOCK && lockty
25ab0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  pe==SHARED_LOCK)
25ac0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
25ad0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  er->eLock==RESER
25ae0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  VED_LOCK && lock
25af0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
25b00 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f  LOCK).  );..  do
25b10 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65   {.    rc = page
25b20 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
25b30 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68  locktype);.  }wh
25b40 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
25b50 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
25b60 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
25b70 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
25b80 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72  rArg) );.  retur
25b90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
25ba0 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
25bb0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25bc0 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
25bd0 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
25be0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
25bf0 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
25c00 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
25c10 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
25c20 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
25c30 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
25c40 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
25c50 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
25c60 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
25c70 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
25c80 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
25c90 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
25ca0 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
25cb0 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
25cc0 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
25cd0 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
25ce0 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
25cf0 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
25d00 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
25d10 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
25d20 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
25d30 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
25d40 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
25d50 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
25d60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
25d70 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
25d80 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
25d90 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
25da0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
25db0 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
25dc0 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
25dd0 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
25de0 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
25df0 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
25e00 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
25e10 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
25e20 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
25e30 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
25e40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
25e50 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
25e60 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
25e70 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
25e80 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
25e90 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
25ea0 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74  avior would be t
25eb0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
25ec0 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74  rrent.** content
25ed0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f   of the page. Ho
25ee0 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69  wever, since thi
25ef0 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
25f00 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68   present in eith
25f10 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  er.** the databa
25f20 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70  se file or the p
25f30 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  ortion of the ro
25f40 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
25f50 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  nd .** sub-journ
25f60 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  al rolled back t
25f70 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64  he content could
25f80 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64   not be restored
25f90 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61   and the.** data
25fa0 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64  base image would
25fb0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
25fc0 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65   It is therefore
25fd0 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20   fortunate that 
25fe0 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73  .** this circums
25ff0 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69  tance cannot ari
26000 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  se..*/.#if defin
26010 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
26020 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
26030 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
26040 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70  raintCb(PgHdr *p
26050 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
26060 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
26070 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72  DIRTY );.  asser
26080 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  t( !subjRequires
26090 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67  Page(pPg) || pPg
260a0 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61  ->pgno<=pPg->pPa
260b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d  ger->dbSize );.}
260c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
260d0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
260e0 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  raint(Pager *pPa
260f0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
26100 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
26110 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
26120 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  e, assertTruncat
26130 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a  eConstraintCb);.
26140 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
26150 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26160 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
26170 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
26180 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
26190 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
261a0 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
261b0 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
261c0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
261d0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
261e0 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
261f0 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
26200 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
26210 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
26220 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
26230 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
26240 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
26250 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
26260 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
26270 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
26280 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
26290 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
262a0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72  is only called r
262b0 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  ight before comm
262c0 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
262d0 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68  tion..** Once th
262e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
262f0 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65  been called, the
26300 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
26310 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72  t either be.** r
26320 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f  olled back or co
26330 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e  mmitted. It is n
26340 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20  ot safe to call 
26350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
26360 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e  d.** then contin
26370 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ue writing to th
26380 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76  e database..*/.v
26390 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
263a0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
263b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
263c0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
263d0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
263e0 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61  ze>=nPage );.  a
263f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
26400 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
26410 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
26420 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
26430 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20   = nPage;..  /* 
26440 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65  At one point the
26450 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65   code here calle
26460 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
26470 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a  Constraint() to.
26480 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74    ** ensure that
26490 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67   all pages being
264a0 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20   truncated away 
264b0 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
264c0 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f  n are,.  ** if o
264d0 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
264e0 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20  oints are open, 
264f0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73  present in the s
26500 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a  avepoint .  ** j
26510 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74  ournal so that t
26520 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f  hey can be resto
26530 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70  red if the savep
26540 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20  oint is rolled. 
26550 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69   ** back. This i
26560 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65  s no longer nece
26570 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75  ssary as this fu
26580 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e  nction is now on
26590 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72  ly.  ** called r
265a0 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  ight before comm
265b0 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
265c0 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67  tion. So althoug
265d0 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  h the .  ** Page
265e0 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69  r object may sti
265f0 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76  ll have open sav
26600 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e  epoints (Pager.n
26610 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a  Savepoint!=0), .
26620 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74    ** they cannot
26630 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
26640 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72   So the assertTr
26650 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26660 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20  () call.  ** is 
26670 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63  no longer correc
26680 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  t. */.}.../*.** 
26690 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
266a0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61   called before a
266b0 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d  ttempting a hot-
266c0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
266d0 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68  . It.** syncs th
266e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
266f0 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74  o disk, then set
26700 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  s pPager->journa
26710 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  lHdr to the.** s
26720 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
26730 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  al file so that 
26740 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
26750 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  ck() routine kno
26760 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65  ws.** that the e
26770 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ntire journal fi
26780 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
26790 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e  ed..**.** Syncin
267a0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
267b0 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61  to disk before a
267c0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
267d0 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65  l it back ensure
267e0 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  s .** that if a 
267f0 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63  power-failure oc
26800 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
26810 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72  rollback, the pr
26820 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74  ocess that.** at
26830 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20  tempts rollback 
26840 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d  following system
26850 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74   recovery sees t
26860 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a  he same journal.
26870 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68  ** content as th
26880 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  is process..**.*
26890 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
268a0 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c  goes as planned,
268b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
268c0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
268d0 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65  e, .** an SQLite
268e0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
268f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
26900 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50  SyncHotJournal(P
26910 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26920 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26930 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67  _OK;.  if( !pPag
26940 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
26950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26960 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
26970 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
26980 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  RMAL);.  }.  if(
26990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
269a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
269b0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
269c0 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
269d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
269e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
269f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  .}../*.** Obtain
26a00 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
26a10 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  a memory mapped 
26a20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  page object for 
26a30 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
26a40 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62  . .** The new ob
26a50 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68  ject will use th
26a60 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c  e pointer pData,
26a70 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78   obtained from x
26a80 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73  Fetch()..** If s
26a90 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
26aa0 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20  ppPage to point 
26ab0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  to the new page 
26ac0 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64  reference.** and
26ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26ae0 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  K. Otherwise, re
26af0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
26b00 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65  rror code and se
26b10 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20  t.** *ppPage to 
26b20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  zero..**.** Page
26b30 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61   references obta
26b40 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ined by calling 
26b50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
26b60 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64  ould be released
26b70 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70  .** by calling p
26b80 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
26b90 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
26ba0 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65  int pagerAcquire
26bb0 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72  MapPage(.  Pager
26bc0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
26bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
26be0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
26bf0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a  /* Page number *
26c20 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  /.  void *pData,
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c40 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27      /* xFetch()'
26c50 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  d data for this 
26c60 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
26c70 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20  **ppPage        
26c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26c90 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20  : Acquired page 
26ca0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50  object */.){.  P
26cb0 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26cd0 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  * Memory mapped 
26ce0 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  page to return *
26cf0 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67 65  /.  .  if( pPage
26d00 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26d10 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
26d20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  = p = pPager->pM
26d30 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20  mapFreelist;.   
26d40 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26d50 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72  eelist = p->pDir
26d60 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
26d70 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65  y = 0;.    memse
26d80 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  t(p->pExtra, 0, 
26d90 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
26da0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
26db0 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48  pPage = p = (PgH
26dc0 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  dr *)sqlite3Mall
26dd0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
26de0 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Hdr) + pPager->n
26df0 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20  Extra);.    if( 
26e00 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
26e10 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
26e20 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
26e30 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
26e40 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
26e50 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
26e60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
26e70 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
26e80 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
26e90 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
26ea0 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
26eb0 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
26ec0 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
26ed0 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
26ee0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
26ef0 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
26f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26f10 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
26f20 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
26f30 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
26f40 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
26f50 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
26f60 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
26f70 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
26f80 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
26f90 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
26fa0 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
26fb0 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
26fc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26fd0 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
26fe0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67  ence to page pPg
26ff0 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20  . pPg must have 
27000 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79  been returned by
27010 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20   an .** earlier 
27020 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71  call to pagerAcq
27030 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  uireMapPage()..*
27040 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
27050 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
27060 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
27070 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
27080 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
27090 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
270a0 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
270b0 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  y = pPager->pMma
270c0 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61  pFreelist;.  pPa
270d0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
270e0 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73  st = pPg;..  ass
270f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
27100 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
27110 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69  ion>=3 );.  sqli
27120 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
27130 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
27140 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67  Pg->pgno-1)*pPag
27150 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
27160 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  g->pData);.}../*
27170 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48  .** Free all PgH
27180 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65  dr objects store
27190 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70  d in the Pager.p
271a0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73  MmapFreelist lis
271b0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
271c0 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64  d pagerFreeMapHd
271d0 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  rs(Pager *pPager
271e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
271f0 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
27200 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
27210 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b  MmapFreelist; p;
27220 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
27230 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  Next = p->pDirty
27240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27250 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(p);.  }.}.../
27260 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
27270 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
27280 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
27290 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
272a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
272b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
272c0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
272d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
272e0 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
272f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
27300 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
27310 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
27320 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
27330 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
27340 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
27350 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
27360 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
27370 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
27380 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
27390 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
273a0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
273b0 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
273c0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
273d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
273e0 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
273f0 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
27400 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
27410 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
27420 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
27430 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
27440 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
27450 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
27460 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
27470 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
27480 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
27490 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
274a0 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
274b0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
274c0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
274d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
274e0 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
274f0 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
27500 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
27510 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
27520 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
27530 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
27540 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
27550 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
27560 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
27570 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
27580 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
27590 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
275a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
275b0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
275c0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
275d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
275e0 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
275f0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
27600 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
27610 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
27620 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20  eSize, pTmp);.  
27630 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
27640 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
27650 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
27660 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
27670 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
27680 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
27690 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
276a0 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
276b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
276c0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
276d0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
276e0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
276f0 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
27700 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
27710 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
27720 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
27730 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
27740 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
27750 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
27760 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
27770 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
27780 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
27790 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
277a0 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
277b0 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
277c0 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
277d0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
277e0 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
277f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
27800 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
27810 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
27820 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
27830 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
27840 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
27850 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
27860 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
27870 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27880 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
27890 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
278a0 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
278b0 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
278c0 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
278d0 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
278e0 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
278f0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
27900 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
27910 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27920 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27930 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27940 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
27950 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
27960 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
27970 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
27980 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
27990 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
279a0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
279b0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
279c0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
279d0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
279e0 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
279f0 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
27a00 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
27a10 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
27a20 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
27a30 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
27a40 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
27a50 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
27a60 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
27a70 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
27a80 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
27a90 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27aa0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
27ab0 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
27ac0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
27ad0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
27ae0 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
27af0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
27b00 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
27b10 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
27b20 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
27b30 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
27b40 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
27b50 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
27b60 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27b70 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
27b80 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
27b90 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
27ba0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
27bb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
27bc0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
27bd0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
27be0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
27bf0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
27c00 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
27c10 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
27c20 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
27c30 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
27c40 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
27c50 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
27c60 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
27c70 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
27c80 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
27c90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
27ca0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
27cb0 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
27cc0 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
27cd0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
27ce0 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
27cf0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
27d00 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
27d10 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
27d20 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
27d30 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
27d40 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
27d50 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
27d60 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
27d70 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
27d80 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
27d90 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
27da0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
27db0 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
27dc0 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
27dd0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27de0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27df0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
27e00 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
27e10 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
27e20 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
27e30 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
27e40 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
27e50 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
27e60 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
27e70 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
27e80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27e90 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
27ea0 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
27eb0 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
27ec0 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
27ed0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
27ee0 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
27ef0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27f00 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
27f10 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
27f20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
27f30 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
27f40 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
27f50 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
27f60 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
27f70 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
27f80 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
27f90 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
27fa0 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
27fb0 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
27fc0 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
27fd0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
27fe0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
27ff0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
28000 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28010 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
28020 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
28030 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
28040 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
28050 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
28060 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
28070 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
28080 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
28090 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
280a0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
280b0 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
280c0 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
280d0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
280e0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
280f0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
28100 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
28110 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
28120 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
28130 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
28140 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
28150 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
28160 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
28170 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
28180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
28190 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
281a0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
281b0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
281c0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
281d0 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
281e0 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
281f0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
28200 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
28210 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
28220 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
28230 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
28240 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
28250 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
28260 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
28270 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
28280 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
28290 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
282a0 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
282b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
282c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
282d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
282e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
282f0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28300 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
28310 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
28320 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28330 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
28340 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
28350 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
28360 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
28370 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
28380 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
28390 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
283a0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
283b0 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ger, 0);.  if( r
283c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
283d0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
283e0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
283f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28400 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
28410 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
28420 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28430 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
28440 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
28450 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
28460 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
28470 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
28480 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
28490 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
284a0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
284b0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
284c0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
284d0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
284e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
284f0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
28500 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
28510 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
28520 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
28530 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
28540 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
28550 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
28560 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
28570 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
28580 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
28590 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
285a0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
285b0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
285c0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
285d0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
285e0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
285f0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
28600 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
28610 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
28620 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
28630 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
28640 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
28650 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
28660 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
28670 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
28680 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
28690 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
286a0 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
286b0 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
286c0 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
286d0 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
286e0 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
286f0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
28700 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
28710 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
28720 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
28730 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
28740 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
28750 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
28760 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
28770 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
28780 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
28790 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
287a0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
287b0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
287c0 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
287d0 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
287e0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
287f0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
28800 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
28810 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
28820 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
28830 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
28840 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
28850 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
28860 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
28870 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28880 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
28890 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
288a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
288b0 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
288c0 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
288d0 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
288e0 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
288f0 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
28900 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
28910 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
28920 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
28930 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
28940 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
28950 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
28960 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
28970 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
28980 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
28990 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
289a0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
289b0 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
289c0 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
289d0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
289e0 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
289f0 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
28a00 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
28a10 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
28a20 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
28a30 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
28a40 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
28a50 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
28a60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28a70 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
28a80 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
28a90 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
28aa0 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
28ab0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
28ac0 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
28ad0 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
28ae0 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
28af0 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
28b00 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
28b10 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
28b20 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
28b30 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
28b40 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
28b50 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
28b60 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
28b70 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
28b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28b90 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
28ba0 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
28bb0 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
28bc0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
28bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28be0 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
28bf0 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
28c00 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
28c10 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
28c20 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
28c30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28c40 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
28c50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
28c60 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
28c70 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
28c80 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
28c90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
28ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
28cb0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
28cc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
28cd0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
28ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
28cf0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
28d00 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
28d10 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
28d20 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
28d30 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
28d40 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
28d50 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
28d60 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
28d70 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
28d80 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
28d90 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
28da0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
28db0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
28dc0 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
28dd0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
28de0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
28df0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
28e00 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
28e10 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
28e20 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
28e30 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
28e40 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
28e50 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
28e60 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
28e70 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
28e80 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
28e90 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
28ea0 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
28eb0 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
28ec0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
28ed0 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
28ee0 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
28ef0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
28f00 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
28f10 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
28f20 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
28f30 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
28f40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
28f50 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
28f60 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
28f70 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
28f80 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
28f90 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28fa0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
28fb0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
28fc0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
28fd0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28fe0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
28ff0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
29000 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
29010 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
29020 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
29030 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
29040 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29050 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
29070 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
29080 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
29090 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
290a0 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
290b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
290c0 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
290d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
290e0 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
290f0 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
29100 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
29110 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
29120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29130 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29140 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
29150 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29160 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
29170 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
29180 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
29190 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
291a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
291b0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
291c0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
291d0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
291e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
291f0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
29200 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
29210 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
29220 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  (pPager->syncFla
29230 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
29240 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
29250 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
29260 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
29270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29280 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
29290 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
292a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
292b0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
292c0 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  alOff;.      if(
292d0 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69   newHdr && 0==(i
292e0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
292f0 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
29300 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
29310 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
29320 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
29330 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
29340 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29350 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29360 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29380 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
29390 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
293a0 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
293b0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20   }..  /* Unless 
293c0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
293d0 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  noSync mode, the
293e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
293f0 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63  s just .  ** suc
29400 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
29410 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c  . Either way, cl
29420 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
29430 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
29440 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e  .  ** all pages.
29450 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
29460 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
29470 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
29480 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  che);.  pPager->
29490 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
294a0 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61  RITER_DBMOD;.  a
294b0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
294c0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
294d0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
294e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
294f0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
29500 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
29510 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
29520 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
29530 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
29540 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
29550 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
29560 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
29570 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
29580 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
29590 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
295a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
295b0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
295c0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
295d0 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
295e0 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
295f0 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
29600 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
29610 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
29620 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
29630 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
29640 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
29650 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
29660 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
29670 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
29680 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29690 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
296a0 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
296b0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
296c0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
296d0 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
296e0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
296f0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
29700 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
29710 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
29720 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
29730 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
29740 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
29750 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
29760 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
29770 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
29780 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
29790 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
297a0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
297b0 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
297c0 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
297d0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
297e0 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
297f0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
29800 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
29810 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
29820 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
29830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29840 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
29850 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
29860 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
29870 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
29880 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
29890 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
298a0 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
298b0 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
298c0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
298d0 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
298e0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
298f0 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
29900 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
29910 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
29920 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
29930 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29940 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
29950 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
29960 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
29970 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
29980 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
29990 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
299a0 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
299b0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
299c0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
299d0 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
299e0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
299f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29a00 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
29a10 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
29a20 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
29a30 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
29a40 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
29a50 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
29a60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29a70 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
29a80 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
29a90 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
29aa0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
29ab0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29ac0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
29ad0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
29ae0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
29af0 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
29b00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29b10 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
29b20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29b30 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
29b40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
29b50 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72  nly called for r
29b60 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69  ollback pagers i
29b70 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73  n WRITER_DBMOD s
29b80 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tate. */.  asser
29b90 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
29ba0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
29bb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
29bc0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
29bd0 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
29be0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
29bf0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
29c00 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
29c10 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
29c20 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
29c30 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
29c40 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
29c50 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
29c60 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
29c70 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
29c80 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
29c90 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
29ca0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
29cb0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
29cc0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
29cd0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
29ce0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
29cf0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
29d00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
29d10 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
29d20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
29d30 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
29d40 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
29d50 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
29d60 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
29d70 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
29d80 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
29d90 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
29da0 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
29db0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
29dc0 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
29dd0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
29de0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
29df0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
29e00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29e10 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  OK .   && pPager
29e20 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61  ->dbHintSize<pPa
29e30 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26  ger->dbSize.   &
29e40 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  & (pList->pDirty
29e50 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e   || pList->pgno>
29e60 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
29e70 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ze).  ){.    sql
29e80 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
29e90 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
29ea0 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
29eb0 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
29ec0 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
29ed0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
29ee0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
29ef0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
29f00 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
29f10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48  .    pPager->dbH
29f20 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
29f30 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ->dbSize;.  }.. 
29f40 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
29f50 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
29f60 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
29f70 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
29f80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
29f90 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
29fa0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
29fb0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
29fc0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
29fd0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
29fe0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
29ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
2a000 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
2a010 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
2a020 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
2a030 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
2a040 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
2a050 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
2a060 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
2a070 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
2a080 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
2a090 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
2a0a0 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
2a0b0 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
2a0c0 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
2a0d0 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
2a0e0 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
2a0f0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2a100 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
2a110 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
2a120 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
2a130 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
2a140 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2a150 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
2a160 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
2a170 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
2a180 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
2a190 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
2a1a0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2a1b0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
2a1e0 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
2a1f0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69      assert( (pLi
2a200 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
2a210 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2a220 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2a230 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
2a240 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
2a250 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20  unter(pList);.. 
2a260 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
2a270 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2a280 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2a290 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
2a2a0 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
2a2b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
2a2c0 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
2a2d0 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
2a2e0 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
2a2f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a300 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a310 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
2a320 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2a330 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
2a340 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
2a350 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
2a360 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
2a370 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
2a380 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
2a390 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
2a3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a3b0 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
2a3c0 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
2a3d0 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
2a3e0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
2a3f0 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
2a400 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
2a410 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
2a420 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2a430 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
2a440 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
2a450 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
2a460 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
2a470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a480 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
2a490 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
2a4a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2a4b0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
2a4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2a4d0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
2a4e0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
2a4f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
2a500 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
2a510 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
2a520 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a530 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
2a540 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2a550 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
2a560 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
2a570 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
2a580 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
2a590 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
2a5a0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
2a5b0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
2a5c0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2a5d0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
2a5e0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2a5f0 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
2a600 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
2a610 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2a620 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
2a630 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
2a640 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
2a650 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  count);.    }els
2a660 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
2a670 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
2a680 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2a690 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2a6a0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
2a6b0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
2a6c0 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
2a6d0 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
2a6e0 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
2a6f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a700 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
2a710 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2a720 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
2a730 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2a740 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
2a750 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2a760 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2a770 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
2a780 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
2a790 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
2a7a0 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
2a7b0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
2a7c0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2a7d0 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
2a7e0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
2a7f0 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
2a800 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
2a810 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2a820 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2a830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2a840 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2a850 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
2a860 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2a870 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2a880 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2a890 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
2a8a0 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
2a8b0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
2a8c0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
2a8d0 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
2a8e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2a8f0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
2a900 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
2a910 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
2a920 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
2a930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
2a950 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
2a960 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
2a970 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
2a980 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
2a990 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2a9a0 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
2a9b0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2a9c0 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
2a9d0 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
2a9e0 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
2a9f0 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
2aa00 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
2aa10 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2aa20 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
2aa30 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2aa40 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
2aa50 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
2aa60 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2aa70 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
2aa80 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
2aa90 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
2aaa0 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
2aab0 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
2aac0 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
2aad0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
2aae0 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
2aaf0 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
2ab00 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2ab10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ab20 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
2ab30 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2ab40 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  er;.  if( pPager
2ab50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2ab60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ab70 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  _OFF ){..    /* 
2ab80 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
2ab90 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20  rnal, if it has 
2aba0 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
2abb0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61   opened */.    a
2abc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2abd0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
2abe0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2abf0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
2ac00 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2ac10 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
2ac20 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2ac30 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  ->sjfd) || pPage
2ac40 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b  r->nSubRec==0 );
2ac50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
2ac60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2ac70 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61   .         || pa
2ac80 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67  geInJournal(pPag
2ac90 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20  er, pPg) .      
2aca0 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
2acb0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2acc0 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
2acd0 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
2ace0 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
2acf0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
2ad00 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
2ad10 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
2ad20 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
2ad30 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
2ad40 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
2ad50 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
2ad60 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
2ad70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ad80 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
2ad90 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
2ada0 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
2adb0 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72  et = (i64)pPager
2adc0 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
2add0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
2ade0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2adf0 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44  a2;.  .      COD
2ae00 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
2ae10 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
2ae20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ae30 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
2ae40 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2ae50 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
2ae60 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2ae70 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2ae80 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2ae90 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
2aea0 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  ts(pPager->sjfd,
2aeb0 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
2aec0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2aed0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2aee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2aef0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2af00 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32  er->sjfd, pData2
2af10 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2af20 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
2af30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2af40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2af50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
2af60 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20  er->nSubRec++;. 
2af70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2af80 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
2af90 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54  );.    rc = addT
2afa0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
2afb0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
2afc0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2afd0 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
2afe0 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
2aff0 67 65 49 66 52 65 71 75 69 72 65 64 28 50 67 48  geIfRequired(PgH
2b000 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
2b010 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2b020 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 65 74  (pPg) ){.    ret
2b030 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  urn subjournalPa
2b040 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65  ge(pPg);.  }else
2b050 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2b060 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
2b070 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2b080 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
2b090 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
2b0a0 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
2b0b0 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
2b0c0 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
2b0d0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
2b0e0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
2b0f0 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
2b100 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
2b110 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
2b120 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
2b130 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
2b140 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
2b150 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
2b160 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
2b170 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
2b180 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
2b190 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
2b1a0 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
2b1b0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2b1c0 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
2b1d0 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
2b1e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
2b1f0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
2b200 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
2b210 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
2b220 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
2b230 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
2b240 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
2b250 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
2b260 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
2b270 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2b280 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
2b290 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
2b2a0 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
2b2b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
2b2c0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
2b2d0 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
2b2e0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2b2f0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
2b300 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
2b310 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2b320 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2b330 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2b340 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
2b350 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
2b360 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
2b370 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2b380 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
2b390 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
2b3a0 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
2b3b0 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
2b3c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2b3d0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
2b3e0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
2b3f0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2b400 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
2b410 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
2b420 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
2b430 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
2b440 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2b450 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
2b460 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
2b470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2b480 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
2b490 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
2b4a0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
2b4b0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
2b4c0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74  ..  /* The doNot
2b4d0 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74  Spill NOSYNC bit
2b4e0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74   is set during t
2b4f0 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20  imes when doing 
2b500 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a  a sync of.  ** j
2b510 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69  ournal (and addi
2b520 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29  ng a new header)
2b530 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e   is not allowed.
2b540 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20    This occurs.  
2b550 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20  ** during calls 
2b560 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
2b570 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79  rite() while try
2b580 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d  ing to journal m
2b590 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67  ultiple.  ** pag
2b5a0 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  es belonging to 
2b5b0 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e  the same sector.
2b5c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
2b5d0 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41  oNotSpill ROLLBA
2b5e0 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73 20  CK and OFF bits 
2b5f0 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
2b600 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a  he spilling.  **
2b610 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2b620 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
2b630 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
2b640 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64  .  This is set d
2b650 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c  uring.  ** a rol
2b660 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65 72  lback or by user
2b670 20 72 65 71 75 65 73 74 2c 20 72 65 73 70 65 63   request, respec
2b680 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  tively..  **.  *
2b690 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c  * Spilling is al
2b6a0 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68  so prohibited wh
2b6b0 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  en in an error s
2b6c0 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20  tate since that 
2b6d0 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20  could.  ** lead 
2b6e0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
2b6f0 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65  uption.   In the
2b700 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
2b710 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a  ntation it .  **
2b720 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
2b730 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  or sqlite3Pcache
2b740 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63 61  Fetch() to be ca
2b750 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74 65  lled with create
2b760 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69  Flag==3.  ** whi
2b770 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  le in the error 
2b780 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20  state, hence it 
2b790 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
2b7a0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
2b7b0 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  o.  ** be called
2b7c0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2b7d0 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  ate.  Neverthele
2b7e0 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61  ss, we include a
2b7f0 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65   NEVER().  ** te
2b800 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72  st for the error
2b810 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66 65   state as a safe
2b820 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75  guard against fu
2b830 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20  ture changes..  
2b840 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2b850 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2b860 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b870 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  OK;.  testcase( 
2b880 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b890 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
2b8a0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65 73  OLLBACK );.  tes
2b8b0 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2b8c0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2b8d0 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74  LFLAG_OFF );.  t
2b8e0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b8f0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b900 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29  ILLFLAG_NOSYNC )
2b910 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2b920 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26  doNotSpill.   &&
2b930 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74   ((pPager->doNot
2b940 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c  Spill & (SPILLFL
2b950 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c  AG_ROLLBACK|SPIL
2b960 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20  LFLAG_OFF))!=0. 
2b970 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c       || (pPg->fl
2b980 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
2b990 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a  _SYNC)!=0).  ){.
2b9a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b9b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  E_OK;.  }..  pPg
2b9c0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
2b9d0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
2b9e0 70 50 61 67 65 72 29 20 29 7b 0a 23 69 66 6e 64  pPager) ){.#ifnd
2b9f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
2ba00 4f 4e 43 55 52 52 45 4e 54 0a 20 20 20 20 2f 2a  ONCURRENT.    /*
2ba10 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
2ba20 69 6f 6e 20 69 73 20 61 20 22 42 45 47 49 4e 20  ion is a "BEGIN 
2ba30 43 4f 4e 43 55 52 52 45 4e 54 22 20 74 72 61 6e  CONCURRENT" tran
2ba40 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67  saction, the pag
2ba50 65 20 0a 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74  e .    ** cannot
2ba60 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64   be flushed to d
2ba70 69 73 6b 2e 20 52 65 74 75 72 6e 20 65 61 72 6c  isk. Return earl
2ba80 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  y in this case. 
2ba90 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2baa0 72 2d 3e 70 41 6c 6c 52 65 61 64 20 29 20 72 65  r->pAllRead ) re
2bab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bac0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
2bad0 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
2bae0 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
2baf0 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
2bb00 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
2bb10 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2bb20 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66  ed(pPg); .    if
2bb30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bb40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2bb50 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
2bb60 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
2bb70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2bb80 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
2bb90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bba0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2bbb0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
2bbc0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2bbd0 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  NC .     || pPag
2bbe0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2bbf0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
2bc00 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  D.    ){.      r
2bc10 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
2bc20 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2bc30 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
2bc40 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2bc50 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
2bc60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2bc70 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
2bc80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bc90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2bca0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2bcb0 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
2bcc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2bcd0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
2bce0 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  t(pPager, pPg);.
2bcf0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2bd00 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
2bd10 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
2bd20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bd30 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
2bd40 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
2bd50 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2bd60 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2bd70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
2bd80 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2bd90 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
2bda0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2bdb0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a  r(pPager, rc); .
2bdc0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
2bdd0 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ll unreferenced 
2bde0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64  dirty pages to d
2bdf0 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
2be00 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61  te3PagerFlush(Pa
2be10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2be20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
2be30 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
2be40 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67  !MEMDB ){.    Pg
2be50 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  Hdr *pList = sql
2be60 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
2be70 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
2be80 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  che);.    assert
2be90 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2bea0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2beb0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2bec0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
2bed0 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  t ){.      PgHdr
2bee0 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
2bef0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69  >pDirty;.      i
2bf00 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d  f( pList->nRef==
2bf10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2bf20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76  = pagerStress((v
2bf30 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  oid*)pPager, pLi
2bf40 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2bf50 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
2bf60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
2bf70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2bf80 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
2bf90 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
2bfa0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
2bfb0 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
2bfc0 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
2bfd0 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
2bfe0 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
2bff0 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
2c000 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
2c010 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
2c020 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
2c030 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
2c040 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
2c050 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c060 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
2c070 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
2c080 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
2c090 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
2c0a0 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
2c0b0 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
2c0c0 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
2c0d0 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
2c0e0 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
2c0f0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
2c100 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
2c110 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
2c120 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
2c130 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
2c140 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
2c150 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
2c160 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
2c170 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2c180 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
2c190 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2c1a0 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
2c1b0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
2c1c0 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
2c1d0 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
2c1e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2c1f0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
2c200 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
2c210 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
2c220 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
2c230 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
2c240 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
2c250 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2c260 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
2c270 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
2c280 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2c290 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2c2a0 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2c2b0 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2c2c0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2c2d0 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2c2e0 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2c2f0 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2c300 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2c310 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2c320 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2c330 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2c340 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2c350 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2c360 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2c370 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2c380 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2c390 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2c3a0 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2c3b0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2c3c0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2c3d0 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2c3e0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2c3f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2c400 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2c410 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2c420 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2c430 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2c440 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2c450 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2c460 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2c470 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2c480 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2c490 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2c4a0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2c4b0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2c4c0 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2c4d0 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2c4e0 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2c4f0 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2c500 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2c510 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2c520 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2c530 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2c540 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2c550 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2c560 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2c570 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2c580 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2c590 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2c5a0 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2c5b0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2c5c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c5d0 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2c5e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2c5f0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2c600 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2c610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2c620 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2c630 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2c640 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2c650 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2c660 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2c670 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2c680 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2c690 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2c6a0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2c6b0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2c6c0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2c6d0 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2c6e0 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2c6f0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2c700 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2c710 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2c720 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2c730 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2c740 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2c750 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2c760 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2c770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2c780 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2c790 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2c7a0 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2c7b0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2c7c0 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2c7d0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2c7e0 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2c7f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2c800 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2c810 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2c820 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
2c830 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
2c840 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2c850 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
2c860 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
2c870 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
2c880 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2c890 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
2c8a0 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
2c8b0 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
2c8c0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
2c8d0 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
2c8e0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
2c8f0 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
2c900 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c910 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
2c920 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
2c930 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
2c940 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
2c950 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
2c960 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
2c970 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2c980 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2c990 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2c9a0 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2c9b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2c9c0 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2c9d0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2c9e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2c9f0 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2ca00 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2ca10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ca20 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2ca30 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2ca40 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2ca50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2ca60 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2ca70 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2ca80 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2ca90 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2caa0 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2cab0 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2cac0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2cad0 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2cae0 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2caf0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2cb00 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2cb10 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
2cb20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
2cb30 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2cb40 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
2cb50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2cb60 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
2cb70 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2cb80 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
2cb90 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
2cba0 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
2cbb0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
2cbc0 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
2cbd0 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
2cbe0 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
2cbf0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
2cc00 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
2cc10 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2cc20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2cc30 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
2cc40 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
2cc50 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
2cc60 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
2cc70 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2cc80 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
2cc90 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
2cca0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2ccb0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2ccc0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2ccd0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2cce0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2ccf0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2cd00 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2cd10 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
2cd20 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2cd30 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2cd40 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2cd50 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2cd60 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2cd70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2cd80 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2cd90 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2cda0 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2cdb0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  = 1;.    if( zFi
2cdc0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2cdd0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ame[0] ){.      
2cde0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2cdf0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a  te3DbStrDup(0, z
2ce00 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2ce10 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2ce20 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0  ) return SQLI
2ce30 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2ce40 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2ce50 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2ce60 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2ce70 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2ce80 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2ce90 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2cea0 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2ceb0 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2cec0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2ced0 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2cee0 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2cef0 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2cf00 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2cf10 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2cf20 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2cf30 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2cf40 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2cf50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2cf60 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2cf70 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2cf80 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2cf90 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2cfa0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2cfb0 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2cfc0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2cfd0 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2cfe0 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2cff0 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2d000 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d010 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2d020 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2d030 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2d040 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2d050 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2d060 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2d070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2d080 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2d090 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2d0a0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2d0b0 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2d0c0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2d0d0 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2d0e0 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2d0f0 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2d100 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2d110 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2d120 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2d130 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2d140 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2d150 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2d160 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2d170 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2d180 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2d190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2d1a0 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2d1b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d1c0 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2d1d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2d1e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2d1f0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2d200 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2d210 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2d220 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2d230 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2d240 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2d250 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2d260 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2d270 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2d280 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2d290 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2d2a0 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2d2b0 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2d2c0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2d2d0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2d2e0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2d2f0 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2d300 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2d310 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2d320 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2d340 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2d350 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2d360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d370 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2d380 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d390 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d3a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2d3b0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2d3c0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2d3d0 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2d3e0 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2d3f0 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2d400 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2d410 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2d420 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2d430 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2d440 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2d450 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2d460 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2d470 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d490 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2d4a0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d4b0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4d0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2d4e0 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2d4f0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2d500 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2d510 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2d520 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2d530 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2d540 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2d550 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2d560 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2d570 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2d580 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2d590 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2d5a0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2d5b0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2d5c0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2d5d0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2d5e0 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2d5f0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2d600 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2d610 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2d620 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2d630 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2d640 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2d650 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2d660 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2d670 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2d680 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2d690 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d6a0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2d6b0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2d6c0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2d6d0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2d6e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2d6f0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2d700 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d710 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2d720 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2d730 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2d740 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d750 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2d760 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2d770 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2d780 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2d790 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2d7a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d7b0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2d7c0 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2d7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2d7e0 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2d7f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2d800 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2d810 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2d820 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2d830 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2d840 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2d850 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d860 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2d870 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d880 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
2d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
2d8a0 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
2d8b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
2d8c0 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
2d8d0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
2d8e0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
2d8f0 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
2d900 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d910 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d920 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
2d930 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
2d940 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2d950 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2d960 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
2d970 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
2d980 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d990 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d9a0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
2d9b0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2d9c0 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
2d9d0 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2d9e0 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
2d9f0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2da00 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
2da10 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
2da20 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
2da30 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
2da40 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
2da50 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
2da60 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
2da70 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
2da80 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29  t( nPathname>0 )
2da90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  ;.    pPager->zJ
2daa0 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
2dab0 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
2dac0 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29  name + 1 + nUri)
2dad0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2dae0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2daf0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2db00 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  name);.    if( n
2db10 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50  Uri ) memcpy(&pP
2db20 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2db30 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55  nPathname+1], zU
2db40 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  ri, nUri);.    m
2db50 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
2db60 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
2db70 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2db80 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2db90 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2dba0 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
2dbb0 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20  l\000", 8+2);.  
2dbc0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2dbd0 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2dbe0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2dbf0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2dc00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2dc10 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2dc20 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2dc30 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2dc40 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2dc50 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2dc60 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2dc70 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2dc80 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2dc90 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2dca0 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20  al\000", 4+1);. 
2dcb0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2dcc0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2dcd0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2dce0 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2dcf0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2dd00 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2dd10 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
2dd20 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
2dd30 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
2dd40 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
2dd50 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2dd60 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2dd70 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2dd80 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2dd90 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddb0 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2ddc0 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2ddd0 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2dde0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2ddf0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2de00 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2de10 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2de20 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
2de30 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65  !memDb );.    re
2de40 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
2de50 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2de60 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
2de70 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2de80 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2de90 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2dea0 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2deb0 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2dec0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2ded0 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2dee0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2def0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2df00 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2df10 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2df20 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2df30 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2df40 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2df50 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2df60 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2df70 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2df80 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2df90 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2dfa0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2dfb0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2dfc0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2dfd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2dfe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2dff0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2e000 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2e010 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2e020 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2e030 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29   if( !readOnly )
2e040 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63  {.        setSec
2e050 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2e060 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2e070 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2e080 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2e090 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2e0a0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
2e0b0 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2e0c0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2e0d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2e0e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2e0f0 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2e100 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2e110 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2e120 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2e130 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2e140 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2e150 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2e160 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2e170 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2e180 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2e190 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e1a0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2e1b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2e1c0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
2e1d0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
2e1e0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
2e1f0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2e200 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2e210 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2e220 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2e230 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
2e240 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
2e250 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e260 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2e270 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2e280 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
2e290 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2e2a0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2e2b0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2e2c0 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2e2d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2e2e0 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2e2f0 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2e300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e310 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2e320 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  i;.            }
2e330 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e340 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2e350 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2e360 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c  er->noLock = sql
2e370 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2e380 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c  (zFilename, "nol
2e390 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ock", 0);.      
2e3a0 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54  if( (iDc & SQLIT
2e3b0 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c  E_IOCAP_IMMUTABL
2e3c0 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  E)!=0.       || 
2e3d0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2e3e0 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2e3f0 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29  immutable", 0) )
2e400 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46  {.          vfsF
2e410 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2e420 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2e430 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74          goto act
2e440 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b  _like_temp_file;
2e450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2e470 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2e480 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2e490 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2e4a0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2e4b0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2e4c0 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2e4d0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2e4e0 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2e4f0 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2e500 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2e510 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2e520 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2e530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2e540 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2e550 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2e560 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2e570 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2e580 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2e590 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2e5a0 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2e5b0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2e5c0 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2e5d0 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2e5e0 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2e5f0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2e600 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2e610 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66  anch also runs f
2e620 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20  or files marked 
2e630 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20  as immutable..  
2e640 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74    */ .act_like_t
2e650 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65  emp_file:.    te
2e660 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
2e670 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2e680 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20   PAGER_READER;  
2e690 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2e6a0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
2e6b0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67  lock */.    pPag
2e6c0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2e6d0 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f  USIVE_LOCK;    /
2e6e0 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65  * Pretend we are
2e6f0 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f   in EXCLUSIVE mo
2e700 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  de */.    pPager
2e710 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20  ->noLock = 1;   
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e730 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f  Do no locking */
2e740 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2e750 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2e760 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2e770 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2e780 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2e790 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2e7a0 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2e7b0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2e7c0 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2e7d0 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2e7e0 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2e7f0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2e800 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2e810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e820 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e830 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2e840 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e850 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2e860 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2e870 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2e880 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2e890 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2e8a0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
2e8b0 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
2e8c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e8d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2e8e0 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
2e8f0 29 3b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  );.    nExtra = 
2e900 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
2e910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e920 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2e930 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2e940 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
2e960 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
2e970 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
2e980 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
2e990 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  che);.  }..  /* 
2e9a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2e9b0 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65  rred above, free
2e9c0 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72 75   the  Pager stru
2e9d0 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
2e9e0 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
2e9f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ea00 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2ea10 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2ea20 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2ea30 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
2ea40 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
2ea50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2ea60 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
2ea70 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41  rn rc;.  }..  PA
2ea80 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20  GERTRACE(("OPEN 
2ea90 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
2eaa0 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
2eab0 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
2eac0 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41  ename));.  IOTRA
2ead0 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
2eae0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
2eaf0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
2eb00 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
2eb10 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
2eb20 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61  ournal;.  /* pPa
2eb30 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
2eb40 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2eb50 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
2eb60 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2eb70 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
2eb80 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2eb90 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2eba0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
2ebb0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2ebc0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
2ebd0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2ebe0 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
2ebf0 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
2ec00 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2ec10 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
2ec20 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  CK; */.  /* pPag
2ec30 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
2ec40 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
2ec50 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
2ec60 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
2ec70 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2ec80 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2ec90 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
2eca0 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
2ecb0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2ecc0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
2ecd0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2ece0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2ecf0 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
2ed00 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
2ed10 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
2ed20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2ed30 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
2ed40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2ed50 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
2ed60 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
2ed70 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
2ed80 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
2ed90 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e  assert( useJourn
2eda0 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  al || pPager->te
2edb0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67  mpFile );.  pPag
2edc0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
2edd0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2ede0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
2edf0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
2ee00 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
2ee10 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2ee20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2ee30 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2ee40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ee50 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2ee60 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ee70 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2ee80 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
2ee90 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2eea0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
2eeb0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2eec0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2eed0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2eee0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2eef0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2ef00 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2ef10 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2ef20 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2ef30 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2ef40 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2ef50 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2ef60 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2ef70 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ef80 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2ef90 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2efa0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2efb0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2efc0 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2efd0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2efe0 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2eff0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2f000 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2f010 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2f020 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2f030 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2f040 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2f050 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2f060 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2f070 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2f080 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2f090 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2f0a0 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2f0b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2f0c0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2f0d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2f0e0 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2f0f0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2f100 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2f110 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2f120 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2f130 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2f140 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2f150 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2f160 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2f170 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2f180 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  )); */.  /* pPag
2f190 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  er->szMmap = SQL
2f1a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
2f1b0 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65  _SIZE // will be
2f1c0 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20   set by btree.c 
2f1d0 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
2f1e0 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
2f1f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f200 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
2f210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f220 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c  e has not be del
2f230 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20  eted or renamed 
2f240 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65  out from.** unde
2f250 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65  r the pager.  Re
2f260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2f270 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2f280 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20  s still were it 
2f290 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f  ought.** to be o
2f2a0 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  n disk.  Return 
2f2b0 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45  non-zero (SQLITE
2f2c0 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
2f2d0 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  D or some other 
2f2e0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72  error.** code fr
2f2f0 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  om sqlite3OsAcce
2f300 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74  ss()) if the dat
2f310 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d  abase has gone m
2f320 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  issing..*/.stati
2f330 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73  c int databaseIs
2f340 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70  Unmoved(Pager *p
2f350 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48  Pager){.  int bH
2f360 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69  asMoved = 0;.  i
2f370 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
2f380 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2f390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f3a0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
2f3b0 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74  >dbSize==0 ) ret
2f3c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2f3d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f3e0 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50  >zFilename && pP
2f3f0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2f400 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  0] );.  rc = sql
2f410 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
2f420 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
2f430 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
2f440 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64  OVED, &bHasMoved
2f450 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2f460 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
2f470 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41      /* If the HA
2f480 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e  S_MOVED file-con
2f490 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d  trol is unimplem
2f4a0 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ented, assume th
2f4b0 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  at the file.    
2f4c0 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
2f4d0 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20  moved.  That is 
2f4e0 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62  the historical b
2f4f0 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74  ehavior of SQLit
2f500 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  e: prior to.    
2f510 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33  ** version 3.8.3
2f520 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b  , it never check
2f530 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  ed */.    rc = S
2f540 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2f550 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2f560 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64  _OK && bHasMoved
2f570 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2f580 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2f590 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OVED;.  }.  retu
2f5a0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2f5b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f5c0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2f5d0 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2f5e0 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2f5f0 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2f600 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2f610 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2f620 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2f630 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2f640 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2f650 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2f660 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2f670 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2f680 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2f690 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2f6a0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2f6b0 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2f6c0 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2f6d0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2f6e0 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2f6f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2f700 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2f710 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2f720 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2f730 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2f740 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2f750 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2f760 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2f770 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2f780 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2f790 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2f7a0 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2f7b0 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2f7c0 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2f7d0 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2f7e0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2f7f0 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2f800 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2f810 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2f820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2f830 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2f840 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2f850 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2f860 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2f870 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2f880 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2f890 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2f8a0 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2f8b0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2f8c0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2f8d0 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2f8e0 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2f8f0 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2f900 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2f910 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2f920 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f930 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2f940 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2f950 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2f960 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2f970 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2f980 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2f990 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2f9a0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2f9b0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2f9c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2f9d0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2f9e0 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2f9f0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2fa00 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2fa10 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2fa20 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2fa30 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2fa40 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2fa50 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2fa60 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2fa70 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2fa80 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2fa90 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2faa0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2fab0 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2fac0 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2fad0 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2fae0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2faf0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2fb00 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2fb10 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2fb20 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2fb30 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2fb40 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2fb50 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2fb60 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2fb70 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2fb80 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2fb90 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2fba0 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2fbb0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2fbc0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2fbd0 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2fbe0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2fbf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2fc00 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2fc10 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2fc20 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2fc30 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2fc40 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2fc50 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2fc60 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2fc70 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2fc80 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2fc90 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2fca0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2fcb0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2fcc0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2fcd0 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2fce0 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2fcf0 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2fd00 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2fd10 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2fd20 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2fd30 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2fd40 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2fd50 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2fd60 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2fd70 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2fd80 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2fd90 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2fda0 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2fdb0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2fdc0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2fdd0 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2fde0 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2fdf0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2fe00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2fe10 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2fe20 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2fe30 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2fe40 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2fe50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fe60 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2fe70 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2fe80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2fe90 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2fea0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2feb0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2fec0 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2fed0 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2fee0 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2fef0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2ff00 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2ff10 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2ff20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2ff30 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2ff40 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2ff50 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2ff60 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2ff70 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2ff80 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2ff90 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2ffa0 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2ffb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2ffc0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2ffd0 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2ffe0 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2fff0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
30000 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
30010 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
30020 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
30030 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
30040 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
30050 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
30060 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
30070 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
30080 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
30090 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
300a0 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
300b0 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
300c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
300d0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
300e0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
300f0 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
30100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30110 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
30120 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
30130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30140 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
30150 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
30160 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
30170 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
30180 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
30190 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
301a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
301b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
301c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65  e database is ze
301d0 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ro pages in size
301e0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
301f0 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65  t either (1) the
30200 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
30210 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74  nal is a remnant
30220 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61   from a prior da
30230 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
30240 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a  same name where.
30250 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
30260 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74  atabase file but
30270 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
30280 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72   was deleted, or
30290 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c   (2) the initial
302a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
302b0 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70  saction that pop
302c0 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74  ulates a new dat
302d0 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72  abase is being r
302e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
302f0 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72      ** In either
30300 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e   case, the journ
30310 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64  al file can be d
30320 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72  eleted.  However
30330 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20  , take care.    
30340 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65      ** not to de
30350 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
30360 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61   file if it is a
30370 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20  lready open due 
30380 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  to.        ** jo
30390 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
303a0 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ST..        */. 
303b0 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
303c0 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e  ==0 && !jrnlOpen
303d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
303e0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
303f0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
30400 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
30410 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
30420 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
30430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30440 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
30450 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
30460 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
30470 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30480 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
30490 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
304a0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
304b0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
304c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
304d0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
304e0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
304f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30500 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
30510 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
30520 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
30530 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
30540 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
30550 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
30560 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30570 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
30580 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
30590 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
305a0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
305b0 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
305c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
305d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
305e0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
305f0 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
30600 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
30610 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
30620 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
30630 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
30640 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
30650 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30660 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
30670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
30680 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
30690 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
306a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
306b0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
306c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
306d0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
306e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
306f0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
30700 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30710 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
30720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30730 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
30740 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
30750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
30760 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
30770 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
30780 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
30790 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
307a0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
307b0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
307c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
307d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
307e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
307f0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
30800 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30810 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
30820 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
30830 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30840 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
30850 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
30860 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
30870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
30880 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
30890 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
308a0 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
308b0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
308c0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
308d0 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
308e0 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
308f0 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
30900 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
30910 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
30920 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
30930 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
30940 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
30950 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
30960 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
30970 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
30980 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
30990 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
309a0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
309b0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
309c0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
309d0 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
309e0 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
309f0 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
30a00 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
30a10 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
30a20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
30a30 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
30a40 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
30a50 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
30a60 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
30a70 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
30a80 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
30a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30aa0 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
30ab0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
30ac0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
30ad0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
30ae0 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
30af0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
30b00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
30b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30b20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
30b30 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
30b40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
30b50 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
30b60 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
30b70 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
30b80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
30b90 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
30ba0 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
30bb0 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74  gerAcquire() unt
30bc0 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
30bd0 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
30be0 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
30bf0 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
30c00 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
30c10 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
30c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
30c30 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
30c40 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
30c50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
30c60 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
30c70 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
30c80 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
30c90 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
30ca0 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
30cb0 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  y in PAGER_OPEN 
30cc0 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
30cd0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
30ce0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30cf0 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
30d00 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
30d10 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
30d20 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
30d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30d40 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
30d50 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
30d60 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
30d70 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
30d80 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
30d90 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
30da0 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
30db0 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
30dc0 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
30dd0 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
30de0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
30df0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
30e00 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
30e10 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
30e20 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
30e30 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
30e40 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
30e50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30e60 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
30e70 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
30e80 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
30e90 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
30ea0 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
30eb0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
30ec0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
30ed0 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
30ee0 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
30ef0 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
30f00 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
30f10 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
30f20 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
30f30 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
30f40 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
30f50 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
30f60 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
30f70 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
30f80 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
30f90 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
30fa0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
30fb0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
30fc0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
30fd0 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
30fe0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
30ff0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
31000 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
31010 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
31020 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77  ror .** occurs w
31030 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
31040 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
31050 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
31060 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a  urnal file or .*
31070 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  * rolling back a
31080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
31090 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
310a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
310b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
310c0 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
310d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
310e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
310f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31100 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
31110 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
31120 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
31130 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
31140 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
31150 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
31160 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
31170 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73  es. This implies
31180 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
31190 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74  state should eit
311a0 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e  her.  ** be OPEN
311b0 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44   or READER. READ
311c0 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ER is only possi
311d0 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72  ble if the pager
311e0 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20   is or was in . 
311f0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
31200 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a  cess mode..  */.
31210 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31220 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
31230 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
31240 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
31250 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
31260 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
31270 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31280 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31290 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
312a0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
312b0 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  DER );.  if( NEV
312c0 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ER(MEMDB && pPag
312d0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20  er->errCode) ){ 
312e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
312f0 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28  rrCode; }..  if(
31300 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
31310 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
31320 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31330 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
31340 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
31350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31360 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
31370 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
31380 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
31390 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20  rt( !MEMDB );.. 
313a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
313b0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
313c0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
313d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
313e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
313f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31400 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock==NO_LOCK |
31410 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
31420 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
31430 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
31440 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
31450 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
31460 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
31470 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
31480 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
31490 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
314a0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
314b0 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
314c0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
314d0 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
314e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
314f0 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  >eLock<=SHARED_L
31500 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
31510 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
31520 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75  pPager, &bHotJou
31530 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rnal);.    }.   
31540 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
31560 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
31570 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e     if( bHotJourn
31580 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
31590 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
315a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
315b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
315c0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
315d0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
315e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
315f0 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
31600 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
31610 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
31620 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
31630 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
31640 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
31650 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
31660 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
31670 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
31680 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
31690 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
316a0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
316b0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
316c0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
316d0 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
316e0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
316f0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
31700 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
31710 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
31720 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
31730 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
31740 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68  still rolling th
31750 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  e .      ** hot-
31760 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20  journal back..  
31770 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
31780 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
31790 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
317a0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
317b0 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20  equested, any.  
317c0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f      ** other pro
317d0 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20  cess attempting 
317e0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
317f0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
31800 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a   get to .      *
31810 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  * this point in 
31820 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
31830 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20  l to obtain its 
31840 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
31850 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ck .      ** on 
31860 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31870 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
31880 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    ** Unless the 
31890 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b  pager is in lock
318a0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
318b0 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ve mode, the loc
318c0 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  k is.      ** do
318d0 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52  wngraded to SHAR
318e0 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74  ED_LOCK before t
318f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
31900 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  urns..      */. 
31910 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
31920 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
31930 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
31940 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31960 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
31970 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
31980 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61  * If it is not a
31990 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20  lready open and 
319a0 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20  the file exists 
319b0 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68  on disk, open th
319c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e .      ** jour
319d0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
319e0 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65  te access. Write
319f0 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69   access is requi
31a00 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20  red because .   
31a10 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69     ** in exclusi
31a20 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
31a30 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
31a40 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
31a50 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  open .      ** a
31a60 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  nd possibly used
31a70 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
31a80 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73  on later on. Als
31a90 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20  o, write-access 
31aa0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75  .      ** is usu
31ab0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f  ally required to
31ac0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
31ad0 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c  urnal in journal
31ae0 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20  _mode=persist . 
31af0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e       ** mode (an
31b00 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e  d also for journ
31b10 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65  al_mode=truncate
31b20 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
31b30 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )..      **.    
31b40 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    ** If the jour
31b50 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
31b60 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
31b70 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
31b80 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
31b90 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
31ba0 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
31bb0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
31bc0 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
31bd0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
31be0 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
31bf0 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
31c00 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a   Or, it .      *
31c10 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20  * may mean that 
31c20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
31c30 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
31c40 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20   when this.     
31c50 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73   ** function was
31c60 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20   called and the 
31c70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
31c80 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
31c90 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
31ca0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
31cb0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
31cc0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
31cd0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
31ce0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20  r->pVfs;.       
31cf0 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20   int bExists;   
31d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
31d10 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
31d20 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
31d30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31d40 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
31d50 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
31d60 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
31d70 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
31d80 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a  STS, &bExists);.
31d90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31da0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78  SQLITE_OK && bEx
31db0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ists ){.        
31dc0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
31dd0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
31de0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
31df0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
31e00 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
31e10 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
31e20 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
31e30 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
31e40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31e50 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
31e60 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
31e70 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
31e80 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
31e90 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
31ea0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
31eb0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
31ec0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66  ==SQLITE_OK && f
31ee0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
31ef0 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  READONLY ){.    
31f00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31f10 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
31f20 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  T;.            s
31f30 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
31f40 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
31f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31f60 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  }.      }. .    
31f70 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
31f80 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
31f90 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
31fa0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
31fb0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
31fc0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
31fd0 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20  ead lock. Purge 
31fe0 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65  the cache before
31ff0 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e  .      ** playin
32000 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a  g back the hot-j
32010 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77  ournal so that w
32020 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77  e don't end up w
32030 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ith.      ** an 
32040 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
32050 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f  he.  Sync the ho
32060 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t journal before
32070 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a   playing.      *
32080 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20  * it back since 
32090 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
320a0 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66   crashed and lef
320b0 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  t the hot journa
320c0 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61  l.      ** proba
320d0 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63  bly did not sync
320e0 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72   it and we are r
320f0 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79  equired to alway
32100 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20  s sync.      ** 
32110 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
32120 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61  re playing it ba
32130 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
32140 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
32150 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
32160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
32170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
32180 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
32190 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
321a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
321b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
321c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
321d0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
321e0 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
321f0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
32200 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
32210 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d  _OPEN;.        }
32220 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
32230 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
32240 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
32250 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62     pagerUnlockDb
32260 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
32270 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LOCK);.      }..
32280 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
322a0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
322b0 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e  h is taken if an
322c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
322d0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70  ile trying to op
322e0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  en.        ** or
322f0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74   roll back a hot
32300 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68  -journal while h
32310 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
32320 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
32330 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75        ** pager_u
32340 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  nlock() routine 
32350 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62  will be called b
32360 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
32370 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  to unlock.      
32380 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49    ** the file. I
32390 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74  f the unlock att
323a0 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  empt fails, then
323b0 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73   Pager.eLock mus
323c0 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  t be.        ** 
323d0 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
323e0 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d  OCK (see the com
323f0 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
32400 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20  define for .    
32410 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c      ** UNKNOWN_L
32420 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e  OCK above for an
32430 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a   explanation). .
32440 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
32450 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74     ** In order t
32460 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f  o get pager_unlo
32470 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c  ck() to do this,
32480 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74   set Pager.eStat
32490 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
324a0 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e  PAGER_ERROR now.
324b0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
324c0 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73  ually counted as
324d0 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20   a transition.  
324e0 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f        ** to ERRO
324f0 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73  R state in the s
32500 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20  tate diagram at 
32510 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
32520 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  file,.        **
32530 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
32540 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c  hat the same cal
32550 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
32560 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20  k() will very.  
32570 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79        ** shortly
32580 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20   transition the 
32590 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  pager object to 
325a0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
325b0 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20  Calling.        
325c0 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ** assert_pager_
325d0 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61  state() would fa
325e0 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68  il now, as it sh
325f0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73  ould not be poss
32600 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ible.        ** 
32610 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73  to be in ERROR s
32620 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20  tate when there 
32630 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e  are zero outstan
32640 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20  ding page .     
32650 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
32660 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
32670 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
32680 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
32690 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
326a0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
326b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
326c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
326d0 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73  OPEN );.      as
326e0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
326f0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
32700 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  K).           ||
32710 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
32720 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
32730 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  r->eLock>SHARED_
32740 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20  LOCK).      );. 
32750 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
32760 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32770 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  && pPager->hasHe
32780 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a  ldSharedLock ){.
32790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
327a0 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
327b0 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
327c0 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20  then check to.  
327d0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68      ** see if th
327e0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
327f0 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
32800 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
32810 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20  as changed,.    
32820 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63    ** flush the c
32830 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48 65  ache.  The hasHe
32840 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61  ldSharedLock fla
32850 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20  g prevents this 
32860 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63  from.      ** oc
32870 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76  curring on the v
32880 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73  ery first access
32890 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f   to a file, in o
328a0 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20  rder to save a. 
328b0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75       ** single u
328c0 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74  nnecessary sqlit
328d0 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20  e3OsRead() call 
328e0 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e  at the start-up.
328f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
32900 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
32910 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ges are detected
32920 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
32930 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
32940 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
32950 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
32960 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
32970 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
32980 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
32990 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
329a0 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
329b0 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
329c0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
329d0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
329e0 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
329f0 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
32a00 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
32a10 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
32a20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
32a30 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
32a40 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
32a50 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
32a60 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
32a70 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
32a80 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
32a90 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
32aa0 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
32ab0 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
32ac0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
32ad0 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
32ae0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
32af0 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
32b00 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
32b10 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
32b20 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
32b30 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  s)];..      rc =
32b40 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
32b50 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
32b60 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
32b70 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20  goto failed;..  
32b80 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20      if( nPage>0 
32b90 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
32ba0 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
32bb0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
32bc0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
32bd0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
32be0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
32bf0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
32c00 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
32c10 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
32c20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
32c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
32c40 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
32c50 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
32c60 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
32c70 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
32c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32c90 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
32ca0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
32cb0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
32cc0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
32cd0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
32ce0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
32cf0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
32d00 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
32d10 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
32d20 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  reset(pPager);..
32d30 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70          /* Unmap
32d40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32d50 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62  le. It is possib
32d60 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c  le that external
32d70 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20   processes.     
32d80 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74     ** may have t
32d90 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74  runcated the dat
32da0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
32db0 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20  hen extended it 
32dc0 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  back.        ** 
32dd0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
32de0 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20  size while this 
32df0 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20  process was not 
32e00 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a  holding a lock..
32e10 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
32e20 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61  is case there ma
32e30 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e  y exist a Pager.
32e40 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61  pMap mapping tha
32e50 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20  t appears.      
32e60 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72    ** to be the r
32e70 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73  ight size but is
32e80 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61   not actually va
32e90 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a  lid. Avoid this.
32ea0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
32eb0 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70  bility by unmapp
32ec0 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e  ing the db here.
32ed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
32ee0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
32ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
32f00 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
32f10 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
32f20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32f30 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
32f40 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
32f50 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
32f60 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
32f70 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
32f80 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
32f90 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
32fa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
32fb0 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
32fc0 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
32fd0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
32fe0 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
32ff0 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ger);.#ifndef SQ
33000 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
33010 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33020 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
33030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
33040 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
33050 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33060 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
33070 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
33080 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
33090 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
330a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
330b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
330c0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
330d0 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
330e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
330f0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
33100 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
33110 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
33120 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
33130 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33140 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
33150 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
33160 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
33170 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
33180 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33190 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
331a0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
331b0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
331c0 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
331d0 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
331e0 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Lock = 1;.  }.  
331f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33200 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
33210 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
33220 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
33230 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
33240 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
33250 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
33260 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
33270 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
33280 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
33290 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
332a0 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
332b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
332c0 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
332d0 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
332e0 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
332f0 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
33300 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
33310 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
33320 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
33330 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
33340 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
33350 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
33360 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26  ->nMmapOut==0 &&
33370 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
33380 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
33390 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a  pPCache)==0) ){.
333a0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
333b0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
333c0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
333d0 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
333e0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
333f0 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
33400 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
33410 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
33420 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
33430 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
33440 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
33450 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
33460 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
33470 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
33480 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
33490 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
334a0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
334b0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
334c0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
334d0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
334e0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
334f0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
33500 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
33510 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
33520 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
33530 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
33540 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
33550 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
33560 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
33570 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
33580 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
33590 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
335a0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
335b0 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
335c0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
335d0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
335e0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
335f0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
33600 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
33610 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
33620 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
33630 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
33640 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
33650 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
33660 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
33670 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
33680 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
33690 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
336a0 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
336b0 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
336c0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
336d0 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
336e0 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
336f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
33700 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
33710 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
33720 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
33730 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
33740 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
33750 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
33760 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
33770 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
33780 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
33790 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
337a0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
337b0 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
337c0 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
337d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
337e0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
337f0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
33800 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
33810 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
33820 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
33830 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
33840 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
33850 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
33860 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
33870 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
33880 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65  ccurs in two sce
33890 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
338a0 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
338b0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
338c0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
338d0 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
338e0 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
338f0 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
33900 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
33910 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
33920 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
33930 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
33940 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  che to be filled
33950 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
33960 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
33970 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
33980 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
33990 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
339a0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
339b0 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
339c0 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  roed instead of.
339d0 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  ** being read fr
339e0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
339f0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
33a00 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
33a10 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
33a20 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
33a30 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
33a40 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
33a50 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
33a60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
33a70 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
33a80 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
33a90 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
33aa0 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
33ab0 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
33ac0 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
33ad0 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
33ae0 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
33af0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
33b00 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
33b10 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
33b20 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
33b30 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
33b40 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
33b50 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
33b60 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
33b70 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
33b80 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
33b90 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
33ba0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
33bb0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
33bc0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
33bd0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
33be0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
33bf0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
33c00 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
33c10 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
33c20 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
33c30 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
33c40 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
33c50 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
33c60 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
33c70 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
33c80 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
33c90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
33ca0 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
33cb0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
33cc0 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
33cd0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
33ce0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
33cf0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
33d00 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
33d10 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
33d20 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
33d30 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
33d40 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
33d50 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
33d60 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
33d70 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
33d80 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
33d90 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
33da0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
33db0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
33dc0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
33dd0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
33de0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
33df0 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
33e00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33e10 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
33e20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
33e30 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
33e40 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
33e50 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
33e60 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
33e70 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
33e80 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
33e90 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
33ea0 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
33eb0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
33ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
33ed0 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33  r *pPg = 0;.  u3
33ee0 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
33ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33f00 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66   Frame to read f
33f10 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  rom WAL file */.
33f20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f    const int noCo
33f30 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26  ntent = (flags &
33f40 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
33f50 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20  TENT);..  /* It 
33f60 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f  is acceptable to
33f70 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79   use a read-only
33f80 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72   (mmap) page for
33f90 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74   any page except
33fa0 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20  .  ** page 1 if 
33fb0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74  there is no writ
33fc0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
33fd0 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52  en or the ACQUIR
33fe0 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  E_READONLY.  ** 
33ff0 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69  flag was specifi
34000 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
34010 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73  . And so long as
34020 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61   the db is not a
34030 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
34040 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   or in-memory da
34050 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f  tabase.  */.  co
34060 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20  nst int bMmapOk 
34070 3d 20 28 70 67 6e 6f 3e 31 20 26 26 20 55 53 45  = (pgno>1 && USE
34080 46 45 54 43 48 28 70 50 61 67 65 72 29 0a 20 20  FETCH(pPager).  
34090 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
340a0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
340b0 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41  R || (flags & PA
340c0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
340d0 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  )).#ifdef SQLITE
340e0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26  _HAS_CODEC.   &&
340f0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
34100 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a  =0.#endif.  );..
34110 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f    /* Optimizatio
34120 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20  n note:  Adding 
34130 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65  the "pgno<=1" te
34140 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d  rm before "pgno=
34150 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c  =0" here.  ** al
34160 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lows the compile
34170 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72  r optimizer to r
34180 65 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73  euse the results
34190 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22   of the "pgno>1"
341a0 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68  .  ** test in th
341b0 65 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65  e previous state
341c0 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20  ment, and avoid 
341d0 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20  testing pgno==0 
341e0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d  in the.  ** comm
341f0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67  on case where pg
34200 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a  no is large. */.
34210 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26    if( pgno<=1 &&
34220 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
34230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
34240 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
34250 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34260 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
34270 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
34280 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
34290 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
342a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f  ;.  assert( noCo
342b0 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61  ntent==0 || bMma
342c0 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73  pOk==0 );..  ass
342d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73  ert( pPager->has
342e0 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d  HeldSharedLock==
342f0 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  1 );..#ifndef SQ
34300 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
34310 52 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 69  RENT.  /* If thi
34320 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45  s is an CONCURRE
34330 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  NT transaction a
34340 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  nd the page bein
34350 67 20 72 65 61 64 20 77 61 73 0a 20 20 2a 2a 20  g read was.  ** 
34360 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
34370 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
34380 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
34390 6e 20 77 61 73 20 6f 70 65 6e 65 64 2c 0a 20 20  n was opened,.  
343a0 2a 2a 20 6d 61 72 6b 20 69 74 20 61 73 20 72 65  ** mark it as re
343b0 61 64 20 69 6e 20 74 68 65 20 70 41 6c 6c 52 65  ad in the pAllRe
343c0 61 64 20 76 65 63 74 6f 72 2e 20 20 2a 2f 0a 20  ad vector.  */. 
343d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
343e0 6c 52 65 61 64 20 26 26 20 70 67 6e 6f 3c 3d 70  lRead && pgno<=p
343f0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
34400 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  e ){.    rc = sq
34410 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
34420 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 2c  Pager->pAllRead,
34430 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
34440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
34450 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34460 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 23 65 6e 64  re_err;.  }.#end
34470 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
34480 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
34490 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
344a0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
344b0 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
344c0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
344d0 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
344e0 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
344f0 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
34500 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
34510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
34520 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
34530 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
34540 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
34550 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
34560 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
34570 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
34580 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
34590 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
345a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
345b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
345c0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
345d0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
345e0 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20   if( bMmapOk && 
345f0 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  iFrame==0 ){.   
34600 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
34610 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   0;..      rc = 
34620 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70  sqlite3OsFetch(p
34630 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
34640 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f        (i64)(pgno
34650 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
34660 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
34670 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61  pageSize, &pData
34680 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
34690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
346a0 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
346b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
346c0 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
346d0 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20 20  READER ){.      
346e0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
346f0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
34700 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
34710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
34720 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
34730 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
34740 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70  AcquireMapPage(p
34750 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61  Pager, pgno, pDa
34760 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20  ta, &pPg);.     
34770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34780 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
34790 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
347a0 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70   (i64)(pgno-1)*p
347b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
347c0 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
347d0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
347e0 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Pg ){.          
347f0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
34800 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
34810 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
34820 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
34830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
34840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34850 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34870 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34880 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34890 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a   }.    }..    {.
348a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63        sqlite3_pc
348b0 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65  ache_page *pBase
348c0 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d 20  ;.      pBase = 
348d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
348e0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
348f0 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  he, pgno, 3);.  
34900 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
34910 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34920 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34930 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65 72  tchStress(pPager
34940 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34950 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20   &pBase);.      
34960 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34970 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
34980 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34990 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d        if( pBase=
349a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
349b0 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
349c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
349d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
349e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
349f0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34a00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34a10 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20    }.      pPg = 
34a20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65  *ppPage = sqlite
34a30 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
34a40 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
34a50 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29  he, pgno, pBase)
34a60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34a70 70 50 67 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  pPg!=0 );.    }.
34a80 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
34a90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34aa0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61  /* Either the ca
34ab0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61  ll to sqlite3Pca
34ac0 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72  cheFetch() retur
34ad0 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20  ned an error or 
34ae0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
34af0 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20   was already in 
34b00 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
34b10 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
34b20 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  on was called.. 
34b30 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f     ** Set pPg to
34b40 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74   0 and jump to t
34b50 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e  he exception han
34b60 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50  dler.  */.    pP
34b70 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 0;.    goto 
34b80 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34b90 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
34ba0 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20   pPg==(*ppPage) 
34bb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
34bc0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
34bd0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34be0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
34bf0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
34c00 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  );..  if( pPg->p
34c10 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74  Pager && !noCont
34c20 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ent ){.    /* In
34c30 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
34c40 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
34c50 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
34c60 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
34c70 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
34c80 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
34c90 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
34ca0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
34cb0 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
34cc0 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
34cd0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
34ce0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
34cf0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48  tat[PAGER_STAT_H
34d00 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  IT]++;.    retur
34d10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
34d20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
34d30 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
34d40 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
34d50 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
34d60 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
34d70 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
34d80 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 2d  d.  */..    pPg-
34d90 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
34da0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
34db0 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
34dc0 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
34dd0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34de0 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
34df0 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
34e00 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
34e10 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
34e20 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
34e30 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
34e40 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
34e50 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
34e60 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
34e70 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
34e80 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
34e90 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
34ea0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34eb0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34ec0 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
34ed0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
34ee0 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
34ef0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
34f00 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
34f10 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
34f20 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
34f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
34f40 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
34f50 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34f60 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
34f70 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
34f80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
34f90 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
34fa0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
34fb0 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
34fc0 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
34fd0 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
34fe0 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
34ff0 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
35000 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
35010 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
35020 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
35030 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
35040 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
35050 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
35060 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
35070 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
35080 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
35090 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
350a0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
350b0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
350c0 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
350d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
350e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
350f0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
35100 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
35110 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
35120 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
35130 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
35140 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
35150 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
35160 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
35170 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
35180 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
35190 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
351a0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
351b0 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
351c0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
351d0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
351e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
351f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
35200 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
35210 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
35220 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
35230 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
35240 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
35250 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
35260 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
35270 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
35280 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
35290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
352a0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
352b0 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f  Pager) && bMmapO
352c0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
352d0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
352e0 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
352f0 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
35300 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  rame);.        i
35310 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35320 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
35330 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
35340 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
35350 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
35360 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
35370 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
35380 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
35390 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
353a0 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
353b0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
353c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
353d0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
353e0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
353f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35400 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
35410 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ash(pPg);.  }.. 
35420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35430 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
35440 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
35450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35460 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
35470 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
35480 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
35490 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
354a0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
354b0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
354c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
354d0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
354e0 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
354f0 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
35500 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
35510 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
35520 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
35530 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
35540 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
35550 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
35560 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
35570 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  he. .**.** See a
35580 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
35590 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
355a0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
355b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
355c0 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
355d0 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
355e0 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
355f0 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
35600 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
35610 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
35620 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
35630 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
35640 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
35650 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
35660 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
35670 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
35680 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
35690 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
356a0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
356b0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
356c0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
356d0 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gno){.  sqlite3_
356e0 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61  pcache_page *pPa
356f0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
35700 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
35710 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
35720 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35730 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
35740 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65    pPage = sqlite
35750 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
35760 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
35770 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  no, 0);.  assert
35780 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50  ( pPage==0 || pP
35790 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
357a0 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28  redLock );.  if(
357b0 20 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   pPage==0 ) retu
357c0 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73  rn 0;.  return s
357d0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
357e0 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
357f0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
35800 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
35810 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
35820 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
35830 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
35840 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
35850 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
35860 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
35870 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
35880 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
35890 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
358a0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
358b0 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
358c0 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
358d0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
358e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
358f0 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
35900 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
35910 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
35920 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ll(DbPage *pPg){
35930 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
35940 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
35950 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  =0 );.  pPager =
35960 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
35970 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  if( pPg->flags &
35980 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20   PGHDR_MMAP ){. 
35990 20 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d     pagerReleaseM
359a0 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  apPage(pPg);.  }
359b0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
359c0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
359d0 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
359e0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
359f0 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73  Pager);.}.void s
35a00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35a10 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
35a20 20 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74   if( pPg ) sqlit
35a30 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
35a40 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ull(pPg);.}../*.
35a50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35a60 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
35a70 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
35a80 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
35a90 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
35aa0 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
35ab0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
35ac0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
35ad0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
35ae0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
35af0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
35b00 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
35b10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
35b20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
35b30 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
35b40 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
35b50 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
35b60 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
35b70 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
35b80 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
35b90 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
35ba0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
35bb0 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
35bc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35bd0 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
35be0 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
35bf0 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
35c00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
35c10 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
35c20 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
35c30 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
35c40 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
35c50 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
35c60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
35c70 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
35c80 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
35c90 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
35ca0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
35cb0 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
35cc0 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
35cd0 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
35ce0 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
35cf0 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
35d00 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
35d10 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
35d20 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
35d30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
35d40 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
35d50 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
35d60 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
35d70 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
35d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
35d90 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
35da0 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
35db0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
35dc0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
35dd0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
35de0 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
35df0 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
35e00 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
35e10 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
35e20 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
35e30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35e40 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
35e50 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
35e60 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
35e70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
35e80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
35e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ea0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
35eb0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
35ec0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
35ed0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
35ee0 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
35ef0 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
35f00 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
35f10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35f20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
35f30 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
35f40 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
35f50 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
35f60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35f70 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
35f80 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
35f90 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
35fa0 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
35fb0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
35fc0 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
35fd0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
35fe0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
35ff0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
36000 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
36010 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
36020 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
36030 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
36040 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
36050 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
36060 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
36070 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
36080 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
36090 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
360a0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
360b0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
360c0 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
360d0 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
360e0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
360f0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
36100 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
36110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36120 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
36130 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
36140 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
36150 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
36160 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
36170 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
36180 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
36190 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
361a0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
361b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
361c0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
361d0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
361e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
361f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
36200 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
36210 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
36220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
36230 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
36240 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
36250 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
36260 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
36270 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
36280 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ATE|.          (
36290 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
362a0 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   ? .            
362b0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
362c0 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
362d0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
362e0 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20  NAL):.          
362f0 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d    (SQLITE_OPEN_M
36300 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  AIN_JOURNAL).   
36310 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20         );..     
36320 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
36330 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
36340 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d  till has the sam
36350 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64  e name as it did
36360 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
36370 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c   it was original
36380 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  ly opened. */.  
36390 20 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62        rc = datab
363a0 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61  aseIsUnmoved(pPa
363b0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
363c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
363d0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
363e0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
363f0 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 72  RITE.          r
36400 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
36410 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
36420 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
36430 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
36440 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
36450 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
36460 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20  (pPager).       
36470 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
36480 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36490 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
364a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
364b0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
364c0 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
364d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
364e0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
364f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
36500 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
36510 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
36520 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
36530 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
36540 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
36550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
36560 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
36570 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
36580 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
36590 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
365a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
365b0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
365c0 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
365d0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
365e0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
365f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
36600 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36610 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
36620 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
36630 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
36640 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36650 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
36660 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
36670 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
36680 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
36690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
366a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
366b0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
366c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
366d0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
366e0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
366f0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
36700 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36710 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36720 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
36730 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
36740 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
36750 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
36760 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
36770 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
36780 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
36790 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
367a0 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
367b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
367c0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
367d0 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
367e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
367f0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
36800 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
36810 74 20 69 73 20 30 2c 20 74 68 65 6e 20 61 63 71  t is 0, then acq
36820 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
36830 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
36840 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36850 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
36860 20 69 73 20 3e 30 2c 20 74 68 65 6e 20 61 63 71   is >0, then acq
36870 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
36880 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
36890 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
368a0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
368b0 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
368c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
368d0 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
368e0 2a 2a 20 49 66 20 28 65 78 46 6c 61 67 3c 30 29  ** If (exFlag<0)
368f0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
36900 65 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  e is in WAL mode
36910 2c 20 64 6f 20 6e 6f 74 20 74 61 6b 65 20 61 6e  , do not take an
36920 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 54 68 65 20  y locks..** The 
36930 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
36940 20 72 75 6e 20 69 6e 20 43 4f 4e 43 55 52 52 45   run in CONCURRE
36950 4e 54 20 6d 6f 64 65 20 69 6e 73 74 65 61 64 2e  NT mode instead.
36960 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
36970 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
36980 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
36990 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
369a0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
369b0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
369c0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
369d0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
369e0 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
369f0 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
36a00 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
36a10 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
36a20 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
36a30 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
36a40 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
36a50 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
36a60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
36a70 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
36a80 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
36a90 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
36aa0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
36ab0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
36ac0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
36ad0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
36ae0 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
36af0 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
36b00 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
36b10 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
36b20 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
36b30 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
36b40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36b50 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
36b60 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
36b70 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
36b80 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
36b90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
36ba0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
36bb0 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
36bc0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
36bd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36be0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
36bf0 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
36c00 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
36c10 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
36c20 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
36c30 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
36c40 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
36c50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36c60 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
36c70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36c80 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
36c90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   );.    if( page
36ca0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
36cb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
36cc0 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
36cd0 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
36ce0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
36cf0 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
36d00 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
36d10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
36d20 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
36d30 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
36d40 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
36d50 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
36d60 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
36d70 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
36d80 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
36d90 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
36da0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
36db0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
36dc0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
36dd0 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
36de0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36df0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
36e00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
36e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
36e20 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
36e30 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
36e40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
36e50 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
36e60 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
36e70 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
36e80 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
36e90 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
36ea0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
36eb0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
36ec0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
36ed0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
36ee0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
36ef0 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
36f00 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
36f10 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
36f20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
36f30 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
36f40 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
36f50 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
36f60 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
36f70 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
36f80 65 78 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20  exFlag>=0 ){.   
36f90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36fa0 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72  3WalBeginWriteTr
36fb0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
36fc0 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20 20 7d  ->pWal);.      }
36fd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36fe0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45    /* Obtain a RE
36ff0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
37000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37010 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  . If the exFlag 
37020 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20  parameter.      
37030 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
37040 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
37050 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
37060 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
37070 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73  The.      ** bus
37080 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
37090 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ck can be used w
370a0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f  hen upgrading to
370b0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20   the EXCLUSIVE. 
370c0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75       ** lock, bu
370d0 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69  t not when obtai
370e0 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45  ning the RESERVE
370f0 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  D lock..      */
37100 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
37110 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
37120 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
37130 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37140 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61  LITE_OK && exFla
37150 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  g>0 ){.        r
37160 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
37170 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
37180 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
37190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
371a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
371b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
371c0 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
371d0 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
371e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
371f0 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
37200 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
37210 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37220 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
37230 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
37240 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
37250 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
37260 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
37270 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
37280 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
37290 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
372a0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
372b0 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
372c0 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
372d0 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
372e0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
372f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
37300 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
37310 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
37320 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
37330 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
37340 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
37350 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
37360 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
37370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
37380 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
37390 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
373a0 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
373b0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
373c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
373d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
373e0 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
373f0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
37400 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
37410 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
37420 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
37430 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
37440 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
37450 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
37460 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
37470 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
37480 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
37490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
374a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
374b0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
374c0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73  LOCKED );.    as
374d0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
374e0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
374f0 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52   );.  }..  PAGER
37500 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
37510 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
37520 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
37530 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37540 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65 20 70  .** Write page p
37550 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  Pg onto the end 
37560 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
37570 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
37580 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
37590 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64 64 50  NE int pagerAddP
375a0 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75  ageToRollbackJou
375b0 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
375c0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
375d0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
375e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
375f0 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72 20 2a   cksum;.  char *
37600 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20 69 4f  pData2;.  i64 iO
37610 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
37620 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
37630 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
37640 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
37650 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
37660 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 74  e that.  ** cont
37670 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
37680 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
37690 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
376a0 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 61  erifies.  ** tha
376b0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
376c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
376d0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
376e0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  NO(pPager) );.. 
376f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37700 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61  >journalHdr<=pPa
37710 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
37720 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50 61 67  );.  CODEC2(pPag
37730 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
37740 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
37750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
37760 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 63 6b  M, pData2);.  ck
37770 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
37780 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
37790 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20 45 76  Data2);..  /* Ev
377a0 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
377b0 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
377c0 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e  curs while journ
377d0 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  alling the.  ** 
377e0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
377f0 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
37800 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
37810 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
37820 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
37830 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
37840 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
37850 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
37860 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
37870 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
37880 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
37890 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
378a0 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e 20 74  stored.  ** in t
378b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
378c0 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
378d0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
378e0 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a  e doing so,.  **
378f0 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
37900 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a   may follow..  *
37910 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c  /.  pPg->flags |
37920 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
37930 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  C;..  rc = write
37940 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
37950 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70  fd, iOff, pPg->p
37960 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
37970 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37980 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
37990 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
379a0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
379b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
379c0 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 69  ze, iOff+4);.  i
379d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
379e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
379f0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
37a00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
37a10 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ff+pPager->pageS
37a20 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20  ize+4, cksum);. 
37a30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37a40 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37a50 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55  .  IOTRACE(("JOU
37a60 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
37a70 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
37a80 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
37a90 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
37aa0 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
37ab0 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 50 41 47  ageSize));.  PAG
37ac0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
37ad0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
37ae0 6e 74 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  nt);.  PAGERTRAC
37af0 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
37b00 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
37b10 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
37b20 2c 0a 20 20 20 20 20 20 20 50 41 47 45 52 49 44  ,.       PAGERID
37b30 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
37b40 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 28 28 70  gno, .       ((p
37b50 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
37b60 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
37b70 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
37b80 70 50 67 29 29 29 3b 0a 0a 20 20 70 50 61 67 65  pPg)));..  pPage
37b90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
37ba0 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67   8 + pPager->pag
37bb0 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  eSize;.  pPager-
37bc0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73 73 65 72  >nRec++;.  asser
37bd0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
37be0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 72 63  urnal!=0 );.  rc
37bf0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
37c00 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
37c10 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
37c20 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o);.  testcase( 
37c30 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
37c40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
37c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
37c60 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
37c70 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64 64 54 6f  );.  rc |= addTo
37c80 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
37c90 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
37ca0 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  no);.  assert( r
37cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
37cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
37cd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
37ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
37cf0 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67   single data pag
37d00 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
37d10 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
37d20 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
37d30 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72   main journal or
37d40 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20   sub-journal as 
37d50 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65  required. If the
37d60 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
37d70 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20   into.** one of 
37d80 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  the journals, th
37d90 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
37da0 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68  bit is set in th
37db0 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  e .** Pager.pInJ
37dc0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e  ournal bitvec an
37dd0 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
37de0 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
37df0 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20  t bitvecs.** of 
37e00 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  any open savepoi
37e10 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61  nts as appropria
37e20 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
37e30 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
37e40 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
37e50 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
37e60 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
37e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37e80 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
37e90 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
37ea0 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d   unless a write-
37eb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
37ec0 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65  already .  ** be
37ed0 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20  en started. The 
37ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
37ef0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
37f00 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
37f10 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  t..  ** It is ne
37f20 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68  ver called in th
37f30 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20  e ERROR state.. 
37f40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
37f50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37f60 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
37f70 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
37f80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37f90 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
37fa0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
37fb0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37fc0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
37fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37fe0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37ff0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
38000 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
38010 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73  rCode==0 );.  as
38020 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65  sert( pPager->re
38030 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 43  adOnly==0 );.  C
38040 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
38050 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
38060 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
38070 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65  be opened. Highe
38080 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73  r level routines
38090 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
380a0 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  ** obtained the 
380b0 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20  necessary locks 
380c0 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69  to begin the wri
380d0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
380e0 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c  but the.  ** rol
380f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69  lback journal mi
38100 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f  ght not yet be o
38110 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77  pen. Open it now
38120 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
38130 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
38140 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
38150 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  ore calling sqli
38160 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
38170 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65  ty() on the page
38180 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
38190 65 2c 20 69 66 20 69 74 20 77 65 72 65 20 64 6f  e, if it were do
381a0 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67  ne after calling
381b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
381c0 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a  keDirty(), then.
381d0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69    ** an error mi
381e0 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68  ght occur and th
381f0 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e  e pager would en
38200 64 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c  d up in WRITER_L
38210 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a  OCKED state.  **
38220 20 77 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b   with pages mark
38230 65 64 20 61 73 20 64 69 72 74 79 20 69 6e 20 74  ed as dirty in t
38240 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  he cache..  */. 
38250 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
38260 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
38270 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
38280 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
38290 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
382a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
382b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
382c0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
382d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
382e0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
382f0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73  ACHEMOD );.  ass
38300 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
38310 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
38320 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
38330 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20 61  e page that is a
38340 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f 64 69 66  bout to be modif
38350 69 65 64 20 61 73 20 64 69 72 74 79 2e 20 2a 2f  ied as dirty. */
38360 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
38370 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
38380 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f 6c 6c 62  .  /* If a rollb
38390 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69 73 20 69  ack journal is i
383a0 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d 61 6b 65  n use, them make
383b0 20 73 75 72 65 20 74 68 65 20 70 61 67 65 20 74   sure the page t
383c0 68 61 74 20 69 73 20 61 62 6f 75 74 0a 20 20 2a  hat is about.  *
383d0 2a 20 74 6f 20 63 68 61 6e 67 65 20 69 73 20 69  * to change is i
383e0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
383f0 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 74 68  ournal, or if th
38400 65 20 70 61 67 65 20 69 73 20 61 20 6e 65 77 20  e page is a new 
38410 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a 20 74 68  page off.  ** th
38420 65 6e 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  en end of the fi
38430 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  le, make sure it
38440 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 50 47   is marked as PG
38450 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 2e 0a 20  HDR_NEED_SYNC.. 
38460 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
38470 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
38480 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70 65 6e 28  l!=0) == isOpen(
38490 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
384a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
384b0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20 20 20 26  nJournal!=0.   &
384c0 26 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  & sqlite3BitvecT
384d0 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  estNotNull(pPage
384e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
384f0 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a 20 20 29  Pg->pgno)==0.  )
38500 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  {.    assert( pa
38510 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
38520 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
38530 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
38540 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
38550 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
38560 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61  rAddPageToRollba
38570 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67 29 3b 0a  ckJournal(pPg);.
38580 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
38590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
385a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
385b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
385c0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
385d0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
385e0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
385f0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
38600 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
38610 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a  D_SYNC;.      }.
38620 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
38630 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
38640 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
38650 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
38660 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
38670 72 29 2c 20 70 50 67 2d 3e 70