/ Hex Artifact Content
Login

Artifact 2916c66aee50f69d9ec56a7619b62d9c6a3bee61:


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 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
4dc0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55   SQLITE_EXTRA_DU
4dd0: 52 41 42 4c 45 20 6f 70 74 69 6f 6e 20 69 73 20  RABLE option is 
4de0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
4df0: 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20 53 51 4c  ime, then.** SQL
4e00: 69 74 65 20 77 69 6c 6c 20 64 6f 20 65 78 74 72  ite will do extr
4e10: 61 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61 74  a fsync() operat
4e20: 69 6f 6e 73 20 77 68 65 6e 20 73 79 6e 63 68 72  ions when synchr
4e30: 6f 6e 6f 75 73 3d 3d 46 55 4c 4c 20 74 6f 20 68  onous==FULL to h
4e40: 65 6c 70 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68  elp.** ensure th
4e50: 61 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  at transactions 
4e60: 61 72 65 20 64 75 72 61 62 6c 65 20 61 63 72 6f  are durable acro
4e70: 73 73 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ss a power failu
4e80: 72 65 2e 20 20 4d 6f 73 74 0a 2a 2a 20 61 70 70  re.  Most.** app
4e90: 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 20 68 61  lications are ha
4ea0: 70 70 79 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ppy as long as t
4eb0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
4ec0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 63 72 6f 73  consistent acros
4ed0: 73 0a 2a 2a 20 61 20 70 6f 77 65 72 20 66 61 69  s.** a power fai
4ee0: 6c 75 72 65 2c 20 61 6e 64 20 61 72 65 20 70 65  lure, and are pe
4ef0: 72 66 65 63 74 6c 79 20 77 69 6c 6c 69 6e 67 20  rfectly willing 
4f00: 74 6f 20 6c 6f 73 65 20 74 68 65 20 6c 61 73 74  to lose the last
4f10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
4f20: 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
4f30: 74 68 65 20 65 78 74 72 61 20 70 65 72 66 6f 72  the extra perfor
4f40: 6d 61 6e 63 65 20 6f 66 20 61 76 6f 69 64 69 6e  mance of avoidin
4f50: 67 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  g directory sync
4f60: 73 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 74 68 65  s..** And so the
4f70: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
4f80: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 20 73 65  EXTRA_DURABLE se
4f90: 74 74 69 6e 67 20 69 73 20 6f 66 66 2e 0a 2a 2f  tting is off..*/
4fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fb0: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a 23 20  EXTRA_DURABLE.# 
4fc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
4fd0: 54 52 41 5f 44 55 52 41 42 4c 45 20 30 0a 23 65  TRA_DURABLE 0.#e
4fe0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ndif.../*.** An 
4ff0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5000: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5010: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
5020: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
5030: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
5040: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
5050: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
5060: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
5070: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
5080: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5090: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
50a0: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
50b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
50c0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
50d0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
50e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
50f0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
5100: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
5110: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
5120: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
5130: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
5140: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
5150: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
5160: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
5170: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
5180: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
5190: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
51a0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
51b0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
51c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
51d0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
51e0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
51f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
5200: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
5210: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
5220: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
5230: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
5240: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
5250: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
5260: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
5270: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
5280: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
5290: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
52a0: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
52b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
52c0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
52f0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
5300: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
5310: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5320: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
5330: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
5340: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
5350: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
5360: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
5370: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
5380: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
5390: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
53a0: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
53b0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
53c0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53e0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
53f0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
5400: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
5410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
5420: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
5430: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
5440: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
5450: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
5460: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
5470: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20 6f  };../*.** Bits o
5480: 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e 6f  f the Pager.doNo
5490: 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53 65  tSpill flag.  Se
54a0: 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72 69  e further descri
54b0: 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  ption below..*/.
54c0: 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41  #define SPILLFLA
54d0: 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30 78  G_OFF         0x
54e0: 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69 6c  01 /* Never spil
54f0: 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76 69  l cache.  Set vi
5500: 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65 66  a pragma */.#def
5510: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  ine SPILLFLAG_RO
5520: 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20 2f  LLBACK    0x02 /
5530: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5540: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5550: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5560: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5570: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f 2a  YNC      0x04 /*
5580: 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62 75   Spill is ok, bu
5590: 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a 2f  t do not sync */
55a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e 20  ../*.** An open 
55b0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
55c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
55d0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
55e0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
55f0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
5600: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
5610: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
5620: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5630: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5640: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5650: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5660: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5670: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5680: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5690: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
56a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
56b0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
56c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
56d0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
56e0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
56f0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
5700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5710: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
5720: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5730: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5740: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5750: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5760: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5770: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5780: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5790: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
57a0: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
57b0: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
57c0: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
57d0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
57e0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
57f0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
5800: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
5810: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
5820: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5830: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5840: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5850: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5860: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5870: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5880: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5890: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
58a0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
58b0: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
58c0: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
58d0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
58e0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
58f0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
5900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
5910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
5920: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5930: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5940: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5950: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5960: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5970: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5980: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5990: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
59a0: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
59b0: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
59c0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
59d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
59e0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
59f0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
5a00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
5a10: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
5a20: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5a30: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5a40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5a50: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5a60: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5a70: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5a80: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5a90: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5aa0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5ab0: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5ac0: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
5ad0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
5ae0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
5af0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
5b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5b10: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
5b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5b30: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5b40: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5b50: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5b60: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5b70: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5b80: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5b90: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5ba0: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5bc0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
5bd0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
5be0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
5bf0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
5c00: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
5c10: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
5c20: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5c30: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5c40: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5c50: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5c60: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5c70: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5c80: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5c90: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5ca0: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5cb0: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5cc0: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5cd0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ce0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5cf0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5d00: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5d10: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5d20: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5d30: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5d40: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5d50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5d70: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5d90: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5da0: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5db0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5dc0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5dd0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5de0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5df0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5e00: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5e10: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5e20: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5e30: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5e40: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5e50: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5e60: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5e70: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5e80: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5e90: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5ea0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5eb0: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5ec0: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ed0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5ee0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5ef0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5f00: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5f10: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5f20: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5f30: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5f40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5f50: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5f60: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5f70: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5f80: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5f90: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5fa0: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5fb0: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5fc0: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5fd0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5fe0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5ff0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
6000: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
6010: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
6020: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
6030: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
6040: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
6050: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
6060: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
6070: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
6080: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
6090: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
60a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
60b0: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
60c0: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
60d0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
60e0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
60f0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
6100: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
6110: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
6120: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
6130: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
6140: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
6150: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
6160: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
6170: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
6180: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
6190: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
61a0: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
61b0: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
61c0: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
61d0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
61e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
61f0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
6200: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
6210: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
6220: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6230: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6240: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6250: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6260: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6270: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6280: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6290: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
62a0: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
62b0: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
62c0: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
62d0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
62e0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
62f0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
6300: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6310: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6320: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6330: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6340: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6350: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6360: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6370: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6380: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6390: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
63a0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
63b0: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
63c0: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
63d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
63e0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
63f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6400: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
6410: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
6420: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6430: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6440: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6450: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6460: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6470: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6480: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6490: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
64a0: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
64b0: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
64c0: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a  e database from.
64d0: 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73 73  **   pagerStress
64e0: 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c  () is permitted,
64f0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
6500: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6510: 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20   not..**   This 
6520: 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 73  flag is set by s
6530: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6540: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6550: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6560: 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72 67  ize.**   is larg
6570: 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
6580: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6590: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
65a0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
65b0: 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70 70  c.**   from happ
65c0: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
65d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
65e0: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
65f0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
6600: 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d  . .**.** subjInM
6610: 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68  emory.**.**   Th
6620: 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  is is a boolean 
6630: 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75  variable. If tru
6640: 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  e, then any requ
6650: 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  ired sub-journal
6660: 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20  .**   is opened 
6670: 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
6680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6690: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d   false, then in-
66a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d  memory.**   sub-
66b0: 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c  journals are onl
66c0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  y used for in-me
66d0: 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  mory pager files
66e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76  ..**.**   This v
66f0: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
6700: 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72 20  ed by the upper 
6710: 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65 20  layer each time 
6720: 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69 74  a new .**   writ
6730: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6740: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 64   opened..**.** d
6750: 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a  bSize, dbOrigSiz
6760: 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  e, dbFileSize.**
6770: 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20 64  .**   Variable d
6780: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
67a0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
67b0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
67c0: 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50 41  t is valid in PA
67d0: 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20 68  GER_READER and h
67e0: 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61 6c  igher states (al
67f0: 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74 20  l states except 
6800: 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61 6e  for.**   OPEN an
6810: 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a 2a  d ERROR). .**.**
6820: 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65 74     dbSize is set
6830: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
6840: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
6850: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
6860: 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72 67  ay be .**   larg
6870: 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65  er than the size
6880: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6890: 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72   (the value stor
68a0: 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ed at offset.** 
68b0: 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74 61    28 of the data
68c0: 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20 74  base header by t
68d0: 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74 68  he btree). If th
68e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
68f0: 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  le.**   is not a
6900: 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
6910: 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
6920: 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20 73  ize, the value s
6930: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64 62  tored in.**   db
6940: 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64 20  Size is rounded 
6950: 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b 42  down (i.e. a 5KB
6960: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6970: 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53 69  ge-size has dbSi
6980: 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78 63  ze==2)..**   Exc
6990: 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74 68  ept, any file th
69a0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
69b0: 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
69c0: 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
69d0: 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61 74  .**   to have at
69e0: 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
69f0: 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69 6c   (i.e. a 1KB fil
6a00: 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73  e with 2K page-s
6a10: 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20 74  ize leads.**   t
6a20: 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a 2a  o dbSize==1)..**
6a30: 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20 77  .**   During a w
6a40: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a50: 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68 20  , if pages with 
6a60: 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72 65  page-numbers gre
6a70: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 64  ater than.**   d
6a80: 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66 69  bSize are modifi
6a90: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
6aa0: 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74   dbSize is updat
6ab0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ed accordingly..
6ac0: 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c 20  **   Similarly, 
6ad0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
6ae0: 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73 69  is truncated usi
6af0: 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74 65  ng PagerTruncate
6b00: 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20 64  Image(), .**   d
6b10: 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65 64  bSize is updated
6b20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  ..**.**   Variab
6b30: 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20 61  les dbOrigSize a
6b40: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61 72  nd dbFileSize ar
6b50: 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74 65  e valid in state
6b60: 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57 52  s .**   PAGER_WR
6b70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  ITER_LOCKED and 
6b80: 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53 69  higher. dbOrigSi
6b90: 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ze is a copy of 
6ba0: 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20 20  the dbSize.**   
6bb0: 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65 20  variable at the 
6bc0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
6bd0: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
6be0: 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c 6c  used during roll
6bf0: 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20 74  back,.**   and t
6c00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
6c10: 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65 73  her or not pages
6c20: 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
6c30: 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a 2a  nalled before.**
6c40: 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65     being modifie
6c50: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f 75  d..**.**   Throu
6c60: 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74 72  ghout a write-tr
6c70: 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69 6c  ansaction, dbFil
6c80: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
6c90: 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20 20  he size of.**   
6ca0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
6cb0: 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69 73   in pages. It is
6cc0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6cd0: 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74 68  f dbSize when th
6ce0: 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61  e.**   write-tra
6cf0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nsaction is firs
6d00: 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75 70  t opened, and up
6d10: 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20 63  dated when VFS c
6d20: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a  alls are made.**
6d30: 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20 74     to write or t
6d40: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
6d50: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
6d60: 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  k. .**.**   The 
6d70: 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65 20  only reason the 
6d80: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
6d90: 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ble is required 
6da0: 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20 0a  is to suppress .
6db0: 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72 79  **   unnecessary
6dc0: 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e 63   calls to xTrunc
6dd0: 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d 6d  ate() after comm
6de0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
6df0: 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20 20  tion. If, .**   
6e00: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
6e10: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
6e20: 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20   the dbFileSize 
6e30: 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61 74  variable indicat
6e40: 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74 68  es .**   that th
6e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6e60: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6e70: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
6e80: 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65 29  e (Pager.dbSize)
6e90: 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  , .**   pager_tr
6ea0: 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c 6c  uncate() is call
6eb0: 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74 72  ed. The pager_tr
6ec0: 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
6ed0: 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a 2a  es xFilesize().*
6ee0: 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20 74  *   to measure t
6ef0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6f00: 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74 68   on disk, and th
6f10: 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74 20  en truncates it 
6f20: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  if required..** 
6f30: 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73 20    dbFileSize is 
6f40: 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72 6f  not used when ro
6f50: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
6f60: 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
6f70: 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67 65  s case.**   page
6f80: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6f90: 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74 69  called unconditi
6fa0: 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d 65  onally (which me
6fb0: 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62 65  ans there may be
6fc0: 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f 20  .**   a call to 
6fd0: 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61 74  xFilesize() that
6fe0: 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79   is not strictly
6ff0: 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20 65   required). In e
7000: 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20 20  ither case,.**  
7010: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
7020: 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  ) may cause the 
7030: 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20 73  file to become s
7040: 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65 72  maller or larger
7050: 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53 69  ..**.** dbHintSi
7060: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ze.**.**   The d
7070: 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61 62  bHintSize variab
7080: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c 69  le is used to li
7090: 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
70a0: 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f 0a  f calls made to.
70b0: 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46 69  **   the VFS xFi
70c0: 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f  leControl(FCNTL_
70d0: 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f  SIZE_HINT) metho
70e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48 69  d. .**.**   dbHi
70f0: 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  ntSize is set to
7100: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64   a copy of the d
7110: 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 77  bSize variable w
7120: 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74 65  hen a.**   write
7130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
7140: 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20 73  opened (at the s
7150: 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46 69  ame time as dbFi
7160: 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20 20  leSize and.**   
7170: 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66 20  dbOrigSize). If 
7180: 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
7190: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
71a0: 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  ) method is call
71b0: 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74 53  ed,.**   dbHintS
71c0: 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  ize is increased
71d0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
71e0: 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f 72  f pages that cor
71f0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a 2a  respond to the.*
7200: 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70 61  *   size-hint pa
7210: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74 68  ssed to the meth
7220: 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61 67  od call. See pag
7230: 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
7240: 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64 65  t() for .**   de
7250: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  tails..**.** err
7260: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  Code.**.**   The
7270: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
7280: 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20  ariable is only 
7290: 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47  ever used in PAG
72a0: 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
72b0: 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  It.**   is set t
72c0: 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74  o zero in all ot
72d0: 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50  her states. In P
72e0: 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
72f0: 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  , Pager.errCode 
7300: 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20  .**   is always 
7310: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
7320: 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
7330: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53   or one of the S
7340: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
7350: 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e  .**   sub-codes.
7360: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
7370: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
7380: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
7390: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
73a0: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
73b0: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
73c0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
73d0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
73e0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
73f0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
7400: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7420: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
7430: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
7440: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
7450: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
7460: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
7470: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
7480: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
7490: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74b0: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
74c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
74d0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
74e0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
74f0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
7500: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
7510: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
7520: 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53  ss */.  u8 ckptS
7530: 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20  yncFlags;       
7540: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7550: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7560: 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a  for checkpoint *
7570: 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c  /.  u8 walSyncFl
7580: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7590: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
75a0: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20  r SYNC_FULL for 
75b0: 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20  wal writes */.  
75c0: 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20  u8 syncFlags;   
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
75e0: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
75f0: 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73  NC_FULL otherwis
7600: 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  e */.  u8 tempFi
7610: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
7620: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
7630: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  is a temporary o
7640: 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65  r immutable file
7650: 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b   */.  u8 noLock;
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b    /* Do not lock
7680: 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20   (except in WAL 
7690: 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65  mode) */.  u8 re
76a0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
76b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
76c0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
76d0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
76e0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
76f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7700: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
7710: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
7720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20  **********.  ** 
7770: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
7780: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
7790: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
77a0: 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72   that change dur
77b0: 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ing.  ** routine
77c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61   operation.  Cla
77d0: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
77e0: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
77f0: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
7800: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
7810: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
7820: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
7830: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
7840: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
7850: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
7860: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7870: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7880: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7890: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
78a0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
78b0: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
78c0: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
78d0: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
78e0: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
78f0: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
7900: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
7910: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
7920: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
7930: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
7940: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
7950: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
7960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7970: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7980: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7990: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
79a0: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
79b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
79c0: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
79d0: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
79e0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
79f0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
7a00: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
7a10: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
7a20: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
7a30: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
7a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7a50: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
7a60: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7a70: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7a80: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7a90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7aa0: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7ab0: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7ac0: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
7ad0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20  subjInMemory;   
7ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7af0: 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72   to use in-memor
7b00: 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  y sub-journals *
7b10: 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68  /.  u8 bUseFetch
7b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7b30: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78  /* True to use x
7b40: 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20  Fetch() */.  u8 
7b50: 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
7b60: 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  k;       /* True
7b70: 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63   if a shared loc
7b80: 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20  k has ever been 
7b90: 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  held */.  Pgno d
7ba0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
7bb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7bc0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
7bd0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
7be0: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
7bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
7c00: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
7c10: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7c20: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
7c30: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
7c40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7c50: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
7c60: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7c70: 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65   Pgno dbHintSize
7c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7c90: 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  Value passed to 
7ca0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
7cb0: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72  call */.  int er
7cc0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
7cd0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7ce0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
7cf0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
7d00: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
7d20: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
7d30: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
7d40: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
7d50: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
7d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
7d70: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
7d80: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
7d90: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
7da0: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
7db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7dc0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
7dd0: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
7de0: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
7df0: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
7e00: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
7e10: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
7e20: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7e30: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
7e40: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
7e50: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7e60: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
7e70: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
7e80: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
7e90: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ea0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
7eb0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
7ec0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
7ed0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
7ee0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7ef0: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
7f00: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
7f10: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
7f20: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
7f30: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
7f40: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7f50: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7f70: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
7f80: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
7f90: 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  eader */.  sqlit
7fa0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
7fb0: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
7fc0: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
7fd0: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
7fe0: 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  esses */.  Pager
7ff0: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
8000: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
8010: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
8020: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
8030: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
8040: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8050: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
8060: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
8070: 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f   u32 iDataVersio
8080: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
8090: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
80a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
80b0: 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63  t changes */.  c
80c0: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
80d0: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
80e0: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
80f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
8100: 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  nges */..  int n
8110: 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20  MmapOut;        
8120: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8130: 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63   of mmap pages c
8140: 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e  urrently outstan
8150: 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ding */.  sqlite
8160: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20  3_int64 szMmap; 
8170: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64        /* Desired
8180: 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69   maximum mmap si
8190: 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ze */.  PgHdr *p
81a0: 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20  MmapFreelist;   
81b0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
81c0: 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65  ree mmap page he
81d0: 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a  aders (pDirty) *
81e0: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
81f0: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
8200: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
8210: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
8220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8260: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
8270: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
8280: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
8290: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
82a0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
82b0: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
82c0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
82d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
82e0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
82f0: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
8300: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
8310: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
8320: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
8330: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
8340: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
8350: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
8360: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
8370: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
8380: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
8390: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
83b0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
83c0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
83d0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
83f0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
8400: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
8410: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
8420: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
8430: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
8440: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
8450: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
8460: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
8470: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
8480: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8490: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
84a0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
84b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
84c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
84d0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
84e0: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
84f0: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
8500: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
8510: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
8520: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
8530: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
8540: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
8550: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
8560: 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33  */.  int aStat[3
8570: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
8580: 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20   /* Total cache 
8590: 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64  hits, misses and
85a0: 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65   writes */.#ifde
85b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
85c0: 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20  int nRead;      
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
85e0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
85f0: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  ad */.#endif.  v
8600: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
8610: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
8620: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
8630: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
8640: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
8650: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
8660: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
8670: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
8680: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
8690: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
86a0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
86b0: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
86c0: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
86d0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
86e0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
86f0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
8700: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
8710: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
8720: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
8730: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
8740: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8760: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
8770: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
8780: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
8790: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
87b0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
87c0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
87d0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43   tmp use */.  PC
87e0: 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20  ache *pPCache;  
87f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8800: 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63  nter to page cac
8810: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66  he object */.#if
8820: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8830: 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c  _WAL.  Wal *pWal
8840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8850: 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61     /* Write-ahea
8860: 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a  d log used by "j
8870: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22  ournal_mode=wal"
8880: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c   */.  char *zWal
8890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88a0: 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66    /* File name f
88b0: 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  or write-ahead l
88c0: 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  og */.#endif.};.
88d0: 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66  ./*.** Indexes f
88e0: 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65  or use with Page
88f0: 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50  r.aStat[]. The P
8900: 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72  ager.aStat[] arr
8910: 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ay contains.** t
8920: 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73  he values access
8930: 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51  ed by passing SQ
8940: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
8950: 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d  CHE_HIT, CACHE_M
8960: 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45  ISS .** or CACHE
8970: 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65  _WRITE to sqlite
8980: 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a  3_db_status()..*
8990: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
89a0: 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65  STAT_HIT   0.#de
89b0: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
89c0: 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20  MISS  1.#define 
89d0: 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
89e0: 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   2../*.** The fo
89f0: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
8a00: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
8a10: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
8a20: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
8a30: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
8a40: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
8a50: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
8a60: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
8a70: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
8a80: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
8a90: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
8aa0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
8ab0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8ac0: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
8ad0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8ae0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
8af0: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
8b00: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8b10: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
8b20: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
8b30: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
8b40: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
8b50: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8b60: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
8b70: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8b80: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
8b90: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
8ba0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8bb0: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
8bc0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
8bd0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
8be0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
8bf0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
8c00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
8c10: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
8c20: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
8c30: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
8c40: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
8c50: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
8c60: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
8c70: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
8c80: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
8c90: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
8ca0: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
8cb0: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
8cc0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
8cd0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
8ce0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
8cf0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  nal is being.** 
8d00: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
8d10: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
8d20: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
8d30: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
8d40: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
8d50: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
8d60: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
8d70: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
8d80: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
8d90: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
8da0: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
8db0: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
8dc0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
8dd0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
8de0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
8df0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
8e00: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
8e10: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
8e20: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
8e30: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
8e40: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
8e50: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
8e60: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
8e70: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
8e80: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
8e90: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
8ea0: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
8eb0: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
8ec0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
8ed0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
8ee0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
8ef0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
8f00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
8f10: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
8f20: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
8f30: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
8f40: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
8f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
8f60: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
8f70: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
8f80: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
8f90: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
8fa0: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
8fb0: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
8fc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
8fd0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
8fe0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
8ff0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
9000: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
9010: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
9020: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
9030: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
9040: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
9050: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
9060: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
9070: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
9080: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
9090: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
90a0: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
90b0: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
90c0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
90d0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
90e0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
90f0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
9100: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
9110: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
9120: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
9130: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
9140: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
9150: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
9160: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
9170: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65   of each page re
9180: 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  cord in the jour
9190: 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a  nal is given by.
91a0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
91b0: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69   macro..*/.#defi
91c0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
91d0: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
91e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
91f0: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
9200: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
9210: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
9220: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
9230: 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73  y the same .** s
9240: 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ize as a single 
9250: 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65  disk sector. See
9260: 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53   also setSectorS
9270: 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ize()..*/.#defin
9280: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
9290: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
92a0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
92b0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
92c0: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
92d0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
92e0: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
92f0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
9300: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
9310: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
9320: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
9330: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
9340: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
9350: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
9360: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
9370: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
9380: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
9390: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
93a0: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
93b0: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
93c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
93d0: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
93e0: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
93f0: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
9400: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
9410: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55  *.** The macro U
9420: 53 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20  SEFETCH is true 
9430: 69 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65  if we are allowe
9440: 64 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65  d to use the xFe
9450: 74 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68  tch and xUnfetch
9460: 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74  .** interfaces t
9470: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
9480: 61 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f  abase using memo
9490: 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a  ry-mapped I/O..*
94a0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
94b0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64  _MMAP_SIZE>0.# d
94c0: 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78  efine USEFETCH(x
94d0: 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63  ) ((x)->bUseFetc
94e0: 68 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  h).#else.# defin
94f0: 65 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a  e USEFETCH(x) 0.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
9520: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
9530: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
9540: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
9550: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
9560: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
9570: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
9580: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
9590: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
95a0: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
95b0: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
95c0: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
95d0: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
95e0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
95f0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
9600: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
9610: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
9620: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
9630: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
9640: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
9650: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
9660: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
9670: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
9680: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
9690: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
96a0: 29 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a  )->pMethods!=0).
96b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
96c0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
96d0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
96e0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
96f0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
9700: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
9710: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
9720: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
9730: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
9740: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
9750: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
9760: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
9770: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
9780: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9790: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
97a0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
97b0: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
97c0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
97d0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
97e0: 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  y) 0.# define pa
97f0: 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
9800: 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ent(z) SQLITE_OK
9810: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42  .# define pagerB
9820: 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
9830: 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ion(z) SQLITE_OK
9840: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9850: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
9860: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
9870: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
9880: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
9890: 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66   );.**.** This f
98a0: 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e  unction runs man
98b0: 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79  y asserts to try
98c0: 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69   to find inconsi
98d0: 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74  stencies in.** t
98e0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
98f0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
9900: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
9910: 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65   int assert_page
9920: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
9930: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
9940: 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74  er = p;..  /* St
9950: 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ate must be vali
9960: 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  d. */.  assert( 
9970: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9980: 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20  _OPEN.       || 
9990: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
99a0: 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c  _READER.       |
99b0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
99c0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
99d0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
99e0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
99f0: 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
9a00: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9a10: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
9a20: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9a30: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a40: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20  RITER_FINISHED. 
9a50: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9a60: 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
9a70: 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72    );..  /* Regar
9a80: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72  dless of the cur
9a90: 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65  rent state, a te
9aa0: 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69  mp-file connecti
9ab0: 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65  on always behave
9ac0: 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20  s.  ** as if it 
9ad0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
9ae0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
9af0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e  abase file. It n
9b00: 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a  ever updates.  *
9b10: 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  * the change-cou
9b20: 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74  nter field, so t
9b30: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
9b40: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
9b50: 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s set..  */.  as
9b60: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9b70: 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b  e==0 || p->eLock
9b80: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9b90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9ba0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9bb0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
9bc0: 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a  untDone );..  /*
9bd0: 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e   If the useJourn
9be0: 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  al flag is clear
9bf0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  , the journal-mo
9c00: 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22  de must be "OFF"
9c10: 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74  . .  ** And if t
9c20: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9c30: 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f  is "OFF", the jo
9c40: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9c50: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a  not be open..  *
9c60: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  /.  assert( p->j
9c70: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9c80: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9c90: 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e  F || p->useJourn
9ca0: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
9cb0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  p->journalMode!=
9cc0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9cd0: 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e  E_OFF || !isOpen
9ce0: 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  (p->jfd) );..  /
9cf0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d  * Check that MEM
9d00: 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e  DB implies noSyn
9d10: 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d  c. And an in-mem
9d20: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e  ory journal. Sin
9d30: 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65  ce .  ** this me
9d40: 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ans an in-memory
9d50: 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20   pager performs 
9d60: 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74  no IO at all, it
9d70: 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65   cannot encounte
9d80: 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53  r .  ** either S
9d90: 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
9da0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e  QLITE_FULL durin
9db0: 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68  g rollback or wh
9dc0: 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a  ile finalizing .
9dd0: 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66    ** a journal f
9de0: 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74  ile. (although t
9df0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  he in-memory jou
9e00: 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rnal implementat
9e10: 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65  ion may .  ** re
9e20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
9e30: 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68  R_NOMEM while th
9e40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9e50: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29  s being written)
9e60: 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  . It .  ** is th
9e70: 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73  erefore not poss
9e80: 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ible for an in-m
9e90: 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65  emory pager to e
9ea0: 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a  nter the ERROR .
9eb0: 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f    ** state..  */
9ec0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
9ed0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9ee0: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
9ef0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9f00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9f10: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9f20: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9f30: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9f40: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9f50: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
9f60: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
9f70: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
9f80: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
9f90: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
9fa0: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
9fb0: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
9fc0: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
9fd0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
9fe0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
9ff0: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
a000: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
a010: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
a020: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
a030: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
a040: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
a050: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a060: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
a070: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
a080: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
a090: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
a0a0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a0b0: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
a0c0: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
a0d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0e0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a0f0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a100: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a110: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a120: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
a130: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
a140: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
a150: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a160: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
a170: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a180: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a190: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a1a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a1b0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a1c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1d0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
a1e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
a1f0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a200: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
a210: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
a220: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a230: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a240: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a250: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a260: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a270: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a280: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a290: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a2a0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a2b0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
a2c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a2d0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
a2e0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
a2f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a300: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a310: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a320: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a330: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a340: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a350: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a360: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a370: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a380: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a390: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a3a0: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a3b0: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a3c0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a3d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a3e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a3f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a400: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a410: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a420: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a430: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a440: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a450: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a460: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a470: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a480: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a490: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a4a0: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a4b0: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a4c0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a4d0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a4e0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a4f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a500: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a510: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a520: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a540: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a550: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a560: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a570: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a580: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a590: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a5a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a5c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a5d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a5e0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a5f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a600: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a610: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a620: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a630: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a640: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a650: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a660: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a670: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a680: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a690: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
a6a0: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a6b0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a6c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a6d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a6e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a6f0: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a700: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a710: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a720: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
a730: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a740: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a750: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a760: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a770: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a780: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a790: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a7a0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a7b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a7c0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a7d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a7e0: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
a7f0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a800: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a810: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a820: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
a830: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a840: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a850: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a860: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a870: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a880: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a890: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a8a0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a8b0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a8c0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a8d0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a8e0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a8f0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a900: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a910: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a920: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a930: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a940: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a950: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
a960: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
a970: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a980: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
a990: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
a9a0: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
a9b0: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
a9c0: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
a9d0: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
a9e0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
a9f0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
aa00: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
aa10: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
aa20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
aa30: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
aa40: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
aa50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
aa60: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
aa70: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
aa80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
aa90: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  }..  return 1;.}
aaa0: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
aab0: 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  f NDEBUG */..#if
aac0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
aad0: 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61   ./*.** Return a
aae0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75   pointer to a hu
aaf0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
ab00: 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20  ing in a static 
ab10: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
ab20: 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f  ning the state o
ab30: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
ab40: 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  ct passed as an 
ab50: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  argument. This.*
ab60: 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  * is intended to
ab70: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
ab80: 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65  debuggers. For e
ab90: 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c  xample, as an al
aba0: 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20  ternative.** to 
abb0: 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20  "print *pPager" 
abc0: 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67  in gdb:.**.** (g
abd0: 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c  db) printf "%s",
abe0: 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61   print_pager_sta
abf0: 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74  te(pPager).*/.st
ac00: 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74  atic char *print
ac10: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
ac20: 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63  er *p){.  static
ac30: 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d   char zRet[1024]
ac40: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
ac50: 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74  rintf(1024, zRet
ac60: 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d  ,.      "Filenam
ac70: 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20  e:      %s\n".  
ac80: 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20      "State:     
ac90: 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25      %s errCode=%
aca0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  d\n".      "Lock
acb0: 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22  :          %s\n"
acc0: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20  .      "Locking 
acd0: 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d  mode:  locking_m
ace0: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
acf0: 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20  "Journal mode:  
ad00: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c  journal_mode=%s\
ad10: 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e  n".      "Backin
ad20: 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c  g store: tempFil
ad30: 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73  e=%d memDb=%d us
ad40: 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20  eJournal=%d\n". 
ad50: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20       "Journal:  
ad60: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d       journalOff=
ad70: 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d  %lld journalHdr=
ad80: 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53  %lld\n".      "S
ad90: 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62  ize:          db
ada0: 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69  size=%d dbOrigSi
adb0: 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65  ze=%d dbFileSize
adc0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70  =%d\n".      , p
add0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20  ->zFilename.    
ade0: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
adf0: 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20  AGER_OPEN       
ae00: 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a       ? "OPEN" :.
ae10: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ae20: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
ae30: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
ae40: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
ae50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ae60: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f  RITER_LOCKED   ?
ae70: 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22   "WRITER_LOCKED"
ae80: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ae90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aea0: 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57  ER_CACHEMOD ? "W
aeb0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20  RITER_CACHEMOD" 
aec0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
aed0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
aee0: 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52  R_DBMOD    ? "WR
aef0: 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20  ITER_DBMOD" :.  
af00: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
af10: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
af20: 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52  NISHED ? "WRITER
af30: 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20  _FINISHED" :.   
af40: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
af50: 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20  PAGER_ERROR     
af60: 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20        ? "ERROR" 
af70: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
af80: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43    , (int)p->errC
af90: 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ode.      , p->e
afa0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20  Lock==NO_LOCK   
afb0: 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b        ? "NO_LOCK
afc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
afd0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
afe0: 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45  OCK   ? "RESERVE
aff0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
b000: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b010: 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53  _LOCK  ? "EXCLUS
b020: 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70  IVE" :.        p
b030: 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
b040: 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52  LOCK     ? "SHAR
b050: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
b060: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
b070: 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f  LOCK    ? "UNKNO
b080: 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  WN" : "?error?".
b090: 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75        , p->exclu
b0a0: 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c  siveMode ? "excl
b0b0: 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c  usive" : "normal
b0c0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  ".      , p->jou
b0d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b0e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
b0f0: 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20  RY   ? "memory" 
b100: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b110: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b120: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
b130: 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20       ? "off" :. 
b140: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b150: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b160: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
b170: 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20    ? "delete" :. 
b180: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b190: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b1a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
b1b0: 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a    ? "persist" :.
b1c0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b1d0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b1e0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
b1f0: 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20  TE ? "truncate" 
b200: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b210: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b220: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
b230: 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22       ? "wal" : "
b240: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
b250: 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c   (int)p->tempFil
b260: 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62  e, (int)p->memDb
b270: 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75  , (int)p->useJou
b280: 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e  rnal.      , p->
b290: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a  journalOff, p->j
b2a0: 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
b2b0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65  , (int)p->dbSize
b2c0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67  , (int)p->dbOrig
b2d0: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
b2e0: 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20  FileSize.  );.. 
b2f0: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
b300: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
b310: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
b320: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
b330: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
b340: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b350: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
b360: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
b370: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
b380: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
b390: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
b3a0: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
b3b0: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
b3c0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
b3d0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b3e0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
b3f0: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
b400: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
b410: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
b420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
b430: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
b440: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
b450: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
b460: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
b470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b480: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
b490: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
b4a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
b4b0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
b4c0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
b4d0: 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
b4e0: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74  pPg->pgno;.  int
b4f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b500: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
b510: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  int; i++){.    p
b520: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
b530: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
b540: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
b550: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
b560: 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c  itvecTestNotNull
b570: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
b580: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
b590: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
b5a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
b5b0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
b5c0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
b5d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
b5e0: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
b5f0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b600: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
b610: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
b620: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
b630: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
b640: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
b650: 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
b660: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
b670: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69  ->pgno);.}.#endi
b680: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
b690: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b6a0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b6b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b6c0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b6d0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b6e0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b6f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b700: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b710: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b720: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b730: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b740: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b750: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b760: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b770: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b780: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b790: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b7a0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b7b0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b7c0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b7d0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b7e0: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b7f0: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b800: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b810: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b820: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b830: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b840: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b850: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b860: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b870: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b880: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b890: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b8a0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b8b0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b8c0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b8d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b8e0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b8f0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b900: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b910: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b920: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b930: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b940: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b950: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b960: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b970: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b980: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b990: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b9a0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b9b0: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b9c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b9d0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b9e0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b9f0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
ba00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
ba10: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
ba20: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
ba30: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
ba40: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
ba50: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
ba60: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
ba70: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
ba80: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
ba90: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
baa0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
bab0: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
bac0: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
bad0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
bae0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
baf0: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
bb00: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
bb10: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
bb20: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
bb30: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
bb40: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
bb50: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
bb60: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
bb70: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
bb80: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
bb90: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
bba0: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
bbb0: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
bbc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bbd0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
bbe0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
bbf0: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
bc00: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
bc10: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
bc20: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
bc30: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
bc40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
bc50: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
bc60: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
bc70: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
bc80: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
bc90: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
bca0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
bcb0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
bcc0: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
bcd0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
bce0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
bcf0: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bd00: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
bd10: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
bd20: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
bd30: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
bd40: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
bd50: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
bd60: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
bd70: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
bd80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
bd90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
bda0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bdb0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
bdc0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
bdd0: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
bde0: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
bdf0: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
be00: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
be10: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
be20: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
be30: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
be40: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
be50: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
be60: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
be70: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
be80: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
be90: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
bea0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
beb0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
bec0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
bed0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bee0: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
bef0: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
bf00: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
bf10: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
bf20: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
bf30: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
bf40: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
bf50: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
bf60: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
bf70: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
bf80: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bf90: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
bfa0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
bfb0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
bfc0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
bfd0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bfe0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bff0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
c000: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
c010: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
c020: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
c030: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
c040: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
c050: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
c060: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
c070: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c080: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
c090: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
c0a0: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
c0b0: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
c0c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
c0d0: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
c0e0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
c0f0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c100: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c110: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c120: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
c130: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
c140: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
c150: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
c160: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
c170: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
c180: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
c190: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
c1a0: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
c1b0: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
c1c0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
c1d0: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
c1e0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
c1f0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
c200: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
c210: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
c220: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
c230: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
c240: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c250: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
c260: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
c270: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
c280: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
c290: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
c2a0: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
c2b0: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
c2c0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
c2d0: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
c2e0: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
c2f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
c300: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
c310: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
c320: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
c330: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
c340: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c350: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c360: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c370: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c380: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c390: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c3a0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c3b0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c3c0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c3d0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c3e0: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c3f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c400: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c410: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c420: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c430: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c440: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c450: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c460: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c470: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c4a0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c4b0: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c4e0: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c4f0: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c510: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c520: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c530: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c540: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c550: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c560: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c570: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c580: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c590: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c5a0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c5b0: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c5c0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c5d0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c5e0: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c5f0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c600: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c610: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c620: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c630: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c640: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c650: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c660: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c670: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c680: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c690: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c6a0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c6b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c6c0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
c6d0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
c6e0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
c6f0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c700: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
c710: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
c720: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
c730: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c740: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
c750: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
c760: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c770: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
c780: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
c790: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
c7a0: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
c7b0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c7c0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
c7d0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
c7e0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
c7f0: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
c800: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c810: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
c820: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
c830: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
c840: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
c850: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
c860: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
c870: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c880: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
c890: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
c8a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c8b0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
c8c0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
c8d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
c8e0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c8f0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c900: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
c910: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c920: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
c930: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
c940: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
c950: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
c960: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
c970: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
c980: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
c990: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
c9a0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c9b0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
c9c0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
c9d0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
c9e0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
c9f0: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
ca00: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
ca10: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
ca20: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
ca30: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
ca40: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
ca50: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
ca60: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
ca70: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
ca80: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
ca90: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
caa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
cab0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
cac0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
cad0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
cae0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
caf0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
cb00: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
cb10: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
cb20: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
cb30: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
cb40: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
cb50: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
cb60: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
cb70: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
cb80: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
cb90: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
cba0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
cbb0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
cbc0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
cbd0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
cbe0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
cbf0: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
cc00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cc10: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
cc20: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
cc30: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
cc40: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
cc50: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
cc60: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
cc70: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
cc80: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
cc90: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
cca0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
ccb0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
ccc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ccd0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
cce0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
ccf0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
cd00: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
cd10: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
cd20: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
cd30: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
cd40: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
cd50: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
cd60: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
cd70: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
cd80: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
cd90: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
cda0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
cdb0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
cdc0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
cdd0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
cde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
cdf0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
ce00: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
ce10: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
ce20: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
ce30: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
ce40: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
ce50: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
ce60: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
ce70: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
ce80: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
ce90: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cea0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
ceb0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
cec0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
ced0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
cee0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
cef0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
cf00: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
cf10: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
cf20: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
cf30: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
cf40: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
cf50: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
cf60: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
cf70: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
cf80: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
cf90: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cfa0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
cfb0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
cfc0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
cfd0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
cfe0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
cff0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
d000: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
d010: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
d020: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
d030: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
d040: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
d050: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
d060: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
d070: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
d080: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
d090: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d0c0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d0e0: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
d0f0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
d100: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
d110: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
d130: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
d140: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
d150: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
d160: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
d170: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
d180: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
d190: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
d1a0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d1c0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
d1d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
d1e0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
d1f0: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
d200: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
d210: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
d220: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
d230: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
d240: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d250: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
d260: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
d270: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
d280: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d290: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d2a0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
d2b0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
d2c0: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30  er .   || len==0
d2d0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
d2e0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
d2f0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
d300: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
d310: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d320: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d330: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
d340: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
d350: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
d360: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
d370: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d380: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d390: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
d3a0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
d3b0: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
d3c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d3d0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
d3e0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
d3f0: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
d400: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
d410: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
d420: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
d430: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
d440: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
d450: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
d460: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
d470: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
d480: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
d490: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
d4a0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
d4b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d4c0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
d4d0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
d4e0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
d4f0: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
d500: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
d510: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
d520: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
d530: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d540: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
d550: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
d560: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
d570: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
d580: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d590: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
d5a0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
d5b0: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
d5c0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
d5d0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
d5e0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
d5f0: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
d600: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
d610: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
d620: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
d630: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
d640: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
d650: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
d660: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
d670: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
d680: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
d690: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
d6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d6c0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d6e0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d750: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d760: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d770: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d780: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d790: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d7a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d7b0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d7c0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d7d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d7e0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d7f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d800: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d810: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d820: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d830: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d840: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d850: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d860: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d870: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d880: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d890: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d8a0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d8b0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d8c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d8d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d8e0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d8f0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d900: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d910: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d920: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d930: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d940: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d950: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d960: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d970: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d980: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d990: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d9a0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d9b0: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d9c0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d9d0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d9e0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d9f0: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
da00: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
da10: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
da20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
da30: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
da40: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
da50: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
da60: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
da70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
da80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
da90: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
daa0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
dab0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
dac0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
dad0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
dae0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
daf0: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
db00: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
db10: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
db20: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
db30: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
db40: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
db50: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
db60: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
db70: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
db80: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
db90: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
dba0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
dbb0: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
dbc0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
dbd0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
dbe0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
dbf0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
dc00: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
dc10: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
dc20: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
dc30: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
dc40: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
dc50: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
dc60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
dc70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
dc80: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
dc90: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
dca0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
dcb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dcc0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
dcf0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
dd00: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
dd10: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
dd20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
dd30: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
dd40: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
dd50: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
dd60: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
dd70: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
dd80: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
dd90: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
dda0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
ddb0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
ddc0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
ddd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
dde0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
ddf0: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
de00: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
de10: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
de20: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
de30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
de40: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
de50: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
de60: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
de70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
de80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
de90: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
dea0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
deb0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
dec0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
ded0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
dee0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
def0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
df00: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
df10: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
df20: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
df30: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
df40: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
df50: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
df60: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
df70: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
df80: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
df90: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
dfa0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
dfb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
dfc0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
dfd0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
dfe0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
dff0: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
e000: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
e010: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
e020: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
e030: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
e040: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
e050: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
e060: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e070: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
e080: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
e090: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e0a0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
e0b0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
e0c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e0d0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
e0e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e0f0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
e100: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
e110: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e120: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
e130: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e140: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
e150: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
e160: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
e170: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
e180: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
e190: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e1a0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
e1b0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
e1c0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
e1d0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
e1e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
e1f0: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
e200: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
e210: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
e220: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
e230: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
e240: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
e250: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
e260: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
e270: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
e280: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
e290: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e2a0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
e2b0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
e2c0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e2d0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
e2e0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e2f0: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e300: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e310: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e320: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e330: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e340: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e350: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e360: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e370: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e380: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e390: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e3a0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e3b0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e3c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e3d0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e3e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e3f0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e400: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e410: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e420: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e430: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e440: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e450: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e460: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e470: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e480: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e490: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e4a0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e4d0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e4e0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e4f0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e510: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e520: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e530: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e540: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e550: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e560: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e570: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e580: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e590: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e5a0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e5b0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e5c0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e5d0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e5e0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e5f0: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e600: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e610: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e620: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e630: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e640: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e650: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e660: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
e670: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
e680: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
e690: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
e6a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
e6b0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
e6c0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
e6d0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
e6e0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e6f0: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e700: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e710: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e720: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e730: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e740: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e750: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e760: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e770: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e780: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e790: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e7a0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e7b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e7c0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e7d0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e7e0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e7f0: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e800: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e810: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e820: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e830: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e840: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e850: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e860: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e870: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e880: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e890: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e8a0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e8b0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e8c0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e8d0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e8e0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e8f0: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e900: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e910: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e920: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e930: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e940: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e950: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e960: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e970: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e980: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e990: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e9a0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e9b0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e9c0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e9d0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e9e0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e9f0: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
ea00: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
ea10: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
ea20: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
ea30: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
ea40: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
ea50: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
ea60: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
ea70: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
ea80: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
ea90: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
eaa0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
eab0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
eac0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
ead0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
eae0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
eaf0: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
eb00: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
eb10: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
eb20: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
eb30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
eb40: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
eb50: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
eb60: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
eb70: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
eb80: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
eb90: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
eba0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ebb0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
ebc0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
ebd0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
ebe0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
ebf0: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
ec00: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
ec10: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
ec20: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
ec30: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
ec40: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
ec50: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
ec60: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ec70: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
ec80: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
ec90: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
eca0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
ecb0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ecc0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
ecd0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
ece0: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
ecf0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
ed00: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
ed10: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ed20: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
ed30: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
ed40: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ed50: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ed60: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
ed70: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
ed80: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
ed90: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
eda0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
edb0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
edc0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
edd0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
ede0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
edf0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
ee00: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
ee10: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
ee20: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ee30: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
ee40: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
ee50: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
ee60: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
ee70: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ee80: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ee90: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
eea0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
eeb0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
eec0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
eed0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
eee0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
eef0: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
ef00: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
ef10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
ef20: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
ef30: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
ef40: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
ef50: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
ef60: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
ef70: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
ef80: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
ef90: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
efa0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
efb0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
efc0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
efd0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
efe0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
eff0: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
f000: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
f010: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
f020: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
f030: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
f040: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
f050: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
f060: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
f070: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
f080: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
f090: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
f0a0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
f0b0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
f0c0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
f0d0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
f0e0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
f0f0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
f100: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
f110: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
f120: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
f130: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
f140: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
f150: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
f160: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
f170: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
f180: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
f190: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
f1a0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
f1b0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
f1c0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
f1d0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
f1e0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f1f0: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
f200: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
f210: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
f220: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
f230: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
f240: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
f250: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
f260: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
f270: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
f280: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
f290: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
f2a0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
f2b0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
f2c0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
f2d0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
f2e0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f2f0: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f300: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f310: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f320: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f330: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f340: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f350: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f360: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f370: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f380: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f390: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f3a0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f3b0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f3c0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f3d0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f3e0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f3f0: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f400: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f410: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f420: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f430: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f440: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f450: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f460: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f470: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f480: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f490: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f4a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f4b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f4c0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f4d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f4e0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f4f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f500: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f510: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f520: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f530: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f540: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f550: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f560: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f570: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f580: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f590: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f5a0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f5b0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f5c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f5d0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f5e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f5f0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f600: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f610: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f620: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f630: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f640: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f650: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f660: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
f670: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
f680: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
f690: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
f6a0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
f6b0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
f6c0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
f6d0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
f6e0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f6f0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f700: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f710: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f720: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f730: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f740: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f750: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f760: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f770: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f780: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f790: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f7a0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f7b0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f7c0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f7d0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f7e0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f7f0: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f800: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f810: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f820: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f830: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f840: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f850: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f860: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f870: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f880: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f890: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f8a0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f8b0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f8c0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f8d0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f8e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f8f0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f900: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f910: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f930: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f940: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f950: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f960: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f970: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f980: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f990: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f9a0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f9b0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f9d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f9e0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f9f0: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
fa00: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
fa10: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
fa20: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
fa30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fa40: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
fa50: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
fa60: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
fa70: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
fa80: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
fa90: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
faa0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
fab0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
fac0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
fad0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
fae0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
faf0: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
fb00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
fb10: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
fb20: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
fb30: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
fb40: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
fb50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fb60: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
fb70: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
fb80: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
fb90: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
fba0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fbb0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
fbc0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
fbd0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
fbe0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fbf0: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
fc00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fc10: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
fc20: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
fc30: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
fc40: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
fc50: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
fc60: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
fc70: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
fc80: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
fc90: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
fca0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
fcb0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
fcc0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
fcd0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
fce0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
fcf0: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
fd00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
fd10: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
fd20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fd30: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
fd40: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
fd50: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
fd60: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
fd70: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
fd80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
fd90: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fda0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
fdb0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
fdc0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
fdd0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
fde0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fdf0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fe00: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
fe10: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
fe20: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
fe30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
fe40: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
fe50: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
fe60: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
fe70: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
fe80: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
fe90: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
fea0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
feb0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
fec0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
fed0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
fee0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fef0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
ff00: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
ff10: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
ff20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
ff30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ff40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
ff50: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
ff60: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
ff70: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
ff80: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ff90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
ffa0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
ffb0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
ffc0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
ffd0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
ffe0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
fff0: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
10000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10010 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
10020 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
10030 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
10040 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
10050 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
10060 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
10070 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
10080 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
10090 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
100a0 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
100b0 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
100c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
100d0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
100e0 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
100f0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
10100 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
10110 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
10120 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
10130 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10140 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
10150 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
10160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10170 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10180 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
10190 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
101a0 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
101b0 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
101c0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
101d0 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
101e0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
101f0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
10200 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
10210 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
10220 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
10230 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
10240 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
10250 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
10260 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
10270 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
10280 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
10290 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
102a0 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
102b0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
102c0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
102d0 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
102e0 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
102f0 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10300 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
10310 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
10320 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
10330 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
10340 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
10350 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
10360 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10370 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10380 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
10390 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
103a0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
103b0 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
103e0 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
103f0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10400 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
10410 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
10420 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
10430 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
10440 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
10450 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
10460 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10470 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10480 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
10490 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
104a0 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
104b0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
104c0 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
104d0 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
104e0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
104f0 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10500 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
10510 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
10520 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
10530 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
10540 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
10550 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
10560 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10570 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10580 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
105a0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
105b0 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
105c0 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
105d0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
105e0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
105f0 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10600 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
10610 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10620 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
10630 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
10640 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10650 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10660 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10670 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10680 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
10690 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
106a0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
106b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
106c0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
106d0 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
106e0 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
106f0 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10700 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10710 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10720 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10730 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10740 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10750 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10760 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10770 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10780 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
10790 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
107a0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
107b0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
107c0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
107d0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
107e0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
107f0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10800 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10810 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10820 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10830 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10840 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10850 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10860 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10880 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
10890 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
108a0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
108b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
108c0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
108d0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
108e0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
108f0 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10900 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10910 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10920 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10930 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10940 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10950 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10960 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10970 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10980 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
10990 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
109a0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
109b0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
109c0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
109d0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
109e0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
109f0 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10a00 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10a10 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10a20 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10a30 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10a40 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10a50 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10a60 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10a70 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10a80 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
10a90 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
10aa0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
10ab0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
10ac0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
10ad0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10ae0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10af0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10b00 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10b10 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10b20 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10b30 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10b40 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10b50 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10b60 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10b70 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10b80 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
10b90 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
10ba0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
10bb0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
10bc0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
10bd0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
10be0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10bf0 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10c00 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10c10 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10c40 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10c60 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10c70 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10c80 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
10c90 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
10ca0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10cb0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
10cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
10cd0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10d00 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10d10 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10d20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10d30 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10d40 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10d50 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10d60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10d70 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10d80 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10d90 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
10da0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
10db0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
10dc0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
10dd0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
10de0 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
10df0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
10e00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10e10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10e20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10e30 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
10e40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e50 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
10e60 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
10e70 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
10e80 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
10e90 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
10ea0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10eb0 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10ec0 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10ed0 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10ee0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10ef0 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10f00 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10f10 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10f20 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10f30 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10f40 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10f50 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10f60 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10f70 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10f80 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10f90 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10fa0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10fb0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10fc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10fd0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10fe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10ff0 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
11000 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
11010 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
11020 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
11030 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
11040 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
11050 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
11060 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
11070 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
11080 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
11090 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
110a0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
110b0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
110c0 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
110d0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
110e0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
110f0 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
11100 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
11110 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
11120 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
11130 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
11140 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
11150 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
11160 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
11170 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
11180 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
11190 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
111a0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
111b0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
111c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
111d0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
111e0 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
111f0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
11200 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
11210 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
11220 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20 20  lMagic, 8,.     
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64 72              iHdr
11250 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
11260 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
11270 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
11280 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11290 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
112a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
112b0 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
112c0 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
112d0 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
112e0 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
112f0 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
11300 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
11310 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
11320 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
11330 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
11340 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
11350 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
11360 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
11370 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
11380 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
11390 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
113a0 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
113b0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
113c0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
113d0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
113e0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
113f0 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
11400 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
11410 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
11420 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
11430 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
11440 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
11450 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
11460 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
11470 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
11480 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
11490 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
114a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
114b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
114c0 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
114d0 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
114e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
114f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11500 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
11510 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11520 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
11530 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11540 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
11550 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
11560 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
11570 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
11580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11590 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
115a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
115b0 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
115c0 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  ion++;.  sqlite3
115d0 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
115e0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
115f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
11600 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
11610 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
11620 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67 65  Return the pPage
11630 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 20  r->iDataVersion 
11640 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c  value.*/.u32 sql
11650 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72  ite3PagerDataVer
11660 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  sion(Pager *pPag
11670 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
11680 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
11690 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65  GER_OPEN );.  re
116a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61  turn pPager->iDa
116b0 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a  taVersion;.}../*
116c0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72  .** Free all str
116d0 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50  uctures in the P
116e0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
116f0 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20  ] array and set 
11700 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53  both.** Pager.aS
11710 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67  avepoint and Pag
11720 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f  er.nSavepoint to
11730 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65   zero. Close the
11740 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
11750 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e  if it is open an
11760 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  d the pager is n
11770 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
11780 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mode..*/.static 
11790 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53  void releaseAllS
117a0 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20  avepoints(Pager 
117b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
117c0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
117d0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
117e0 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
117f0 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  h Pager.aSavepoi
11800 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  nt */.  for(ii=0
11810 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11820 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11830 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
11840 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11850 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
11860 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
11870 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
11880 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11890 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  || sqlite3IsMemJ
118a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73  ournal(pPager->s
118b0 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  jfd) ){.    sqli
118c0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
118d0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
118e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
118f0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
11900 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
11910 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11920 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
11930 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11940 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
11950 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
11960 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
11970 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
11980 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
11990 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
119a0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
119b0 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
119c0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
119d0 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
119e0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
119f0 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
11a00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
11a10 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
11a20 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
11a30 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11a40 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11a60 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
11a70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11a80 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
11a90 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
11aa0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11ab0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11ac0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
11ad0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
11ae0 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
11af0 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
11b00 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
11b10 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
11b20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
11b30 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
11b40 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
11b50 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
11b60 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11b70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
11b80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
11b90 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
11ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11bb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11bc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11bd0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
11be0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
11bf0 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
11c00 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52  not.** in the ER
11c10 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
11c20 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65  wise, it switche
11c30 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50  s the pager to P
11c40 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61  AGER_OPEN.** sta
11c50 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
11c60 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11c70 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
11c80 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61  s mode, the data
11c90 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20  base file is.** 
11ca0 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63  completely unloc
11cb0 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ked. If the file
11cc0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64   is unlocked and
11cd0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
11ce0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68   does.** not exh
11cf0 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54  ibit the UNDELET
11d00 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70  ABLE_WHEN_OPEN p
11d10 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75  roperty, the jou
11d20 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
11d30 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73  closed (if it is
11d40 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66   open)..**.** If
11d50 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11d60 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
11d70 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
11d80 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a  is called, the .
11d90 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
11da0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61  he pager cache a
11db0 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66  re discarded bef
11dc0 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61  ore switching ba
11dd0 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50  ck to .** the OP
11de0 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64  EN state. Regard
11df0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
11e00 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11e10 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a  exclusive-mode.*
11e20 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f  * or not, any jo
11e30 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20  urnal file left 
11e40 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
11e50 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74  em will be treat
11e60 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a  ed.** as a hot-j
11e70 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
11e80 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20  d back the next 
11e90 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e  time a read-tran
11ea0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70  saction.** is op
11eb0 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72  ened (by this or
11ec0 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   by any other co
11ed0 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74  nnection)..*/.st
11ee0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
11ef0 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
11f00 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74  ager){..  assert
11f10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
11f20 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
11f30 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
11f40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11f50 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20  OPEN .       || 
11f60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11f70 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29  PAGER_ERROR .  )
11f80 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ;..  sqlite3Bitv
11f90 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11fa0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
11fb0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
11fc0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nal = 0;.  relea
11fd0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11fe0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
11ff0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
12000 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
12010 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
12020 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73  r->jfd) );.    s
12030 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
12040 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
12050 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70  er->pWal);.    p
12060 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12070 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65  PAGER_OPEN;.  }e
12080 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
12090 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
120a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
120d0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61  e returned by pa
120e0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f  gerUnlockDb() */
120f0 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69  .    int iDc = i
12100 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
12110 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  )?sqlite3OsDevic
12120 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
12130 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a  (pPager->fd):0;.
12140 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
12150 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
12160 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e  support deletion
12170 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20   of open files, 
12180 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73  then.    ** clos
12190 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
121a0 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
121b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
121c0 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ck.  Otherwise. 
121d0 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f     ** another co
121e0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
121f0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
12200 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74  e might delete t
12210 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f  he file.    ** o
12220 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
12230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
12240 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12250 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
12260 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12270 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12280 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
12290 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
122a0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
122b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
122c0 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  L      & 5)!=1 )
122d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
122e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
122f0 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d  _DELETE   & 5)!=
12300 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12310 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12320 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35  ODE_TRUNCATE & 5
12330 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
12340 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12350 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
12360 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69  & 5)==1 );.    i
12370 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c  f( 0==(iDc & SQL
12380 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
12390 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29  TABLE_WHEN_OPEN)
123a0 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61  .     || 1!=(pPa
123b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
123c0 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20   & 5).    ){.   
123d0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
123e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
123f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12400 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12410 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12420 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f   and the call to
12430 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
12440 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
12450 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20   fails, set the 
12460 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20  current lock to 
12470 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
12480 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20  e the comment.  
12490 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23    ** above the #
124a0 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f  define for UNKNO
124b0 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
124c0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68  xplanation of wh
124d0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  y this.    ** is
124e0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
124f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
12500 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
12510 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
12520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12530 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  K && pPager->eSt
12540 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
12550 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12560 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57  ->eLock = UNKNOW
12570 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  N_LOCK;.    }.. 
12580 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
12590 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61  state may be cha
125a0 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f  nged from PAGER_
125b0 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f  ERROR to PAGER_O
125c0 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20  PEN here.    ** 
125d0 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67  without clearing
125e0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
125f0 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69   This is intenti
12600 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72  onal - the error
12610 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20  .    ** code is 
12620 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20  cleared and the 
12630 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74  cache reset in t
12640 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a  he block below..
12650 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12660 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12670 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  de || pPager->eS
12680 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
12690 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  R );.    pPager-
126a0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
126b0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
126c0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
126d0 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OPEN;.  }..  /*
126e0 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
126f0 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
12700 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12710 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
12720 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64   be.  ** trusted
12730 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65  . Now that there
12740 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
12750 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
12760 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a  o the pager,.  *
12770 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20  * it can safely 
12780 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47  move back to PAG
12790 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54  ER_OPEN state. T
127a0 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62  his happens in b
127b0 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  oth.  ** normal 
127c0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f  and exclusive-lo
127d0 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f  cking mode..  */
127e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
127f0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61 73  rrCode ){.    as
12800 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
12810 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
12820 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
12830 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
12840 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
12850 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50 61  empFile;.    pPa
12860 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12870 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50  GER_OPEN;.    pP
12880 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
12890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
128a0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
128b0 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
128c0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
128d0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
128e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
128f0 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
12900 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
12910 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
12920 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f  Master = 0;.}../
12930 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12940 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
12950 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f  never an IOERR o
12960 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61  r FULL error tha
12970 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68  t requires.** th
12980 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73  e pager to trans
12990 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45  ition into the E
129a0 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61  RROR state may a
129b0 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  hve occurred..**
129c0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
129d0 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
129e0 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
129f0 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
12a00 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ond .** the erro
12a10 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
12a20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
12a30 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
12a40 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c  ion. The .** val
12a50 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
12a60 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
12a70 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
12a80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
12a90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
12aa0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
12ab0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c  SQLITE_FULL, SQL
12ac0 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65  ITE_IOERR or one
12ad0 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52   of the.** IOERR
12ae0 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20   sub-codes, the 
12af0 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
12b00 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
12b10 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
12b20 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
12b30 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57  Pager.errCode. W
12b40 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72  hile the pager r
12b50 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52  emains in the ER
12b60 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c  ROR state,.** al
12b70 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c  l major API call
12b80 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77  s on the Pager w
12b90 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
12ba0 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72  return Pager.err
12bb0 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Code..**.** The 
12bc0 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69  ERROR state indi
12bd0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
12be0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12bf0 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
12c00 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
12c10 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
12c20 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
12c30 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
12c40 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
12c50 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12c60 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
12c70 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
12c80 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
12c90 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
12ca0 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
12cb0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
12cc0 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
12cd0 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
12ce0 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
12cf0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12d00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
12d10 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
12d20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
12d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12d40 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
12d50 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
12d60 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
12d70 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
12d80 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
12d90 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
12da0 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
12db0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
12dc0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
12dd0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
12de0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
12df0 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61  K ||.       (pPa
12e00 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30  ger->errCode & 0
12e10 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
12e20 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  RR.  );.  if( rc
12e30 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
12e40 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f  | rc2==SQLITE_IO
12e50 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ERR ){.    pPage
12e60 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
12e70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12e80 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f  ate = PAGER_ERRO
12e90 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12ea0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
12eb0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
12ec0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12ed0 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a  Pgno nPage);../*
12ee0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12ef0 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
12f00 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
12f10 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
12f20 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
12f30 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
12f40 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
12f50 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
12f60 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
12f70 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
12f80 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
12f90 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
12fa0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
12fb0 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
12fc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
12fd0 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
12fe0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
12ff0 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
13000 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
13010 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
13020 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
13030 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
13040 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
13050 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
13060 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
13070 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
13080 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
13090 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
130a0 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
130b0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
130c0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
130d0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
130e0 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
130f0 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
13100 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
13110 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13120 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
13130 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
13140 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
13150 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
13160 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
13170 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
13180 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
13190 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
131a0 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
131b0 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
131c0 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
131d0 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
131e0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
131f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13200 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
13210 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13220 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
13230 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
13240 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
13250 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
13260 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
13270 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
13280 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
13290 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
132a0 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
132b0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
132c0 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
132d0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
132e0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
132f0 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
13300 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
13310 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
13320 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
13330 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
13340 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
13350 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
13360 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
13370 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
13380 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13390 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
133a0 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
133b0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
133c0 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
133d0 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
133e0 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
133f0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
13400 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
13410 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
13420 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
13430 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
13440 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
13450 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
13460 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
13470 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13480 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
13490 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
134a0 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
134b0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
134c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
134d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
134e0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
134f0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
13500 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
13510 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
13520 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
13530 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
13540 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
13550 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
13560 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
13570 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
13580 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
13590 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
135a0 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
135b0 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
135c0 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
135d0 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
135e0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
135f0 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13600 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
13610 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
13620 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
13630 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
13640 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
13650 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
13660 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
13670 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
13680 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
13690 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
136a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
136b0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
136c0 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
136d0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
136e0 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
136f0 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
13700 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13710 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
13720 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13730 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
13740 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
13750 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
13760 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
13770 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
13780 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13790 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
137a0 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
137b0 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
137c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
137d0 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
137e0 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
137f0 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
13800 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
13810 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
13820 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
13830 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
13840 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
13850 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
13860 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
13870 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
13880 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
13890 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
138a0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
138b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
138c0 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20   hasMaster, int 
138d0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20  bCommit){.  int 
138e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
138f0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13900 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
13910 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
13920 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
13930 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13940 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
13950 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
13960 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
13970 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
13980 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
13990 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
139a0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
139b0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
139c0 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
139d0 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
139e0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
139f0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
13a00 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
13a10 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
13a20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
13a30 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
13a40 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
13a50 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
13a60 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
13a70 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
13a80 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
13a90 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
13aa0 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
13ab0 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
13ac0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
13ad0 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
13ae0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
13af0 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
13b00 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
13b10 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
13b20 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
13b30 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
13b40 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
13b50 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
13b60 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
13b70 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
13b80 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
13b90 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13ba0 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
13bb0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
13bc0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
13bd0 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
13be0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
13bf0 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
13c00 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
13c10 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
13c20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
13c30 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
13c40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
13c50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
13c60 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
13c70 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
13c80 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
13c90 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
13ca0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
13cb0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
13cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13cd0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
13ce0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
13cf0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
13d00 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
13d10 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
13d20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
13d30 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
13d40 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
13d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
13d60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
13d70 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
13d80 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13d90 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
13da0 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
13db0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13dc0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
13dd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13de0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13df0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
13e00 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ORY );.      sql
13e10 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
13e20 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
13e30 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13e40 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13e50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
13e60 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
13e70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13e80 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
13e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13ea0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
13eb0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13ec0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
13ed0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
13ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13f00 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
13f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
13f20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
13f30 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  ew file size is 
13f40 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
13f50 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61   inode right awa
13f60 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  y..          ** 
13f70 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f  Otherwise the jo
13f80 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75  urnal might resu
13f90 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  rrect following 
13fa0 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64  a power loss and
13fb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
13fc0 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72 61  use the last tra
13fd0 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c  nsaction to roll
13fe0 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20   back.  See.    
13ff0 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f        ** https:/
14000 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c  /bugzilla.mozill
14010 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63  a.org/show_bug.c
14020 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20  gi?id=1072773.  
14030 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14040 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14050 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
14060 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
14070 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
14080 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14090 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
140a0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
140b0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
140c0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
140d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
140e0 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
140f0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14100 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
14110 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
14120 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14130 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
14140 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
14150 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
14160 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
14170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14180 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
14190 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
141a0 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
141b0 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
141c0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
141d0 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
141e0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
141f0 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
14200 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
14210 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
14220 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
14230 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
14240 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
14250 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
14260 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
14270 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14280 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
14290 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
142a0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a  emory journal. .
142b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
142c0 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21 70  nt bDelete = (!p
142d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
142e0 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  && sqlite3Journa
142f0 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  lExists(pPager->
14300 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73  jfd));.      ass
14310 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
14320 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14330 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
14340 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
14350 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
14360 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14370 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
14380 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
14390 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
143a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
143b0 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
143c0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
143d0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
143e0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
143f0 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20   bDelete ){.    
14400 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14410 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
14420 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
14430 4a 6f 75 72 6e 61 6c 2c 20 0a 20 20 20 20 20 20  Journal, .      
14440 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
14450 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 53  r->fullSync && S
14460 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55 52 41  QLITE_EXTRA_DURA
14470 42 4c 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BLE);.      }.  
14480 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
14490 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
144a0 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ES.  sqlite3Pcac
144b0 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
144c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
144d0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
144e0 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  sh);.  if( pPage
144f0 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20  r->dbSize==0 && 
14500 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
14510 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
14520 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
14530 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74  PgHdr *p = sqlit
14540 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
14550 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  ager, 1);.    if
14560 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
14570 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20  pageHash = 0;.  
14580 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14590 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b  UnrefNotNull(p);
145a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
145b0 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  f..  sqlite3Bitv
145c0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
145d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
145e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
145f0 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
14600 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
14610 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
14620 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
14630 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  ache);.  sqlite3
14640 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
14650 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14660 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
14670 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
14680 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
14690 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57     /* Drop the W
146a0 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69  AL write-lock, i
146b0 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20  f any. Also, if 
146c0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
146d0 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f  as in .    ** lo
146e0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
146f0 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73  sive mode but is
14700 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70   no longer, drop
14710 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a   the EXCLUSIVE .
14720 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64      ** lock held
14730 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14740 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14750 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
14760 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61  alEndWriteTransa
14770 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
14780 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  al);.    assert(
14790 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
147a0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
147b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
147c0 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65  bCommit && pPage
147d0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50  r->dbFileSize>pP
147e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
147f0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
14800 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
14810 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
14820 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c  ansaction in rol
14830 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20  lback-journal.  
14840 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65    ** mode if the
14850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
14860 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72  n disk is larger
14870 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
14880 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
14890 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
148a0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
148b0 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e  een finalized an
148c0 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
148d0 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73  n .    ** succes
148e0 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64  sfully committed
148f0 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53  , but the EXCLUS
14900 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c  IVE lock is stil
14910 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  l held on the.  
14920 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74    ** file. So it
14930 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e   is safe to trun
14940 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
14950 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69  e file to its mi
14960 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71  nimum.    ** req
14970 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a  uired size.  */.
14980 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14990 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
149a0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
149b0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
149c0 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
149d0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
149e0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
149f0 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69  ITE_OK && bCommi
14a00 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  t && isOpen(pPag
14a10 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72  er->fd) ){.    r
14a20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
14a30 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
14a40 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
14a50 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57  L_COMMIT_PHASETW
14a60 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  O, 0);.    if( r
14a70 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
14a80 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
14a90 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
14aa0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
14ab0 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21  veMode .   && (!
14ac0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14ad0 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61  er) || sqlite3Wa
14ae0 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
14af0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29  Pager->pWal, 0))
14b00 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  .  ){.    rc2 = 
14b10 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
14b20 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
14b30 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
14b40 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
14b50 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
14b60 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
14b70 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67  R_READER;.  pPag
14b80 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
14b90 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  0;..  return (rc
14ba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
14bb0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  rc);.}../*.** Ex
14bc0 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
14bd0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
14be0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
14bf0 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
14c00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a  atabase file. .*
14c10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14c20 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
14c30 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14c40 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74  state, do not at
14c50 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f  tempt .** the ro
14c60 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74  llback at this t
14c70 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61  ime. Instead, pa
14c80 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
14c90 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63  called. The.** c
14ca0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14cb0 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61  ock() will disca
14cc0 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
14cd0 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a   pages, unlock.*
14ce0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14cf0 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ile and move the
14d00 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f   pager back to O
14d10 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68  PEN state. If th
14d20 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  is .** means tha
14d30 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  t there is a hot
14d40 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e  -journal left in
14d50 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
14d60 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63  , the next .** c
14d70 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74  onnection to obt
14d80 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
14d90 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28  k on the pager (
14da0 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69  which may be thi
14db0 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20  s one) .** will 
14dc0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
14dd0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
14de0 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
14df0 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
14e00 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  OR state, but an
14e10 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
14e20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
14e30 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
14e40 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
14e50 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
14e60 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
14e70 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74  ter the ERROR st
14e80 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
14e90 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
14ea0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
14eb0 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
14ec0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
14ed0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14ee0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
14ef0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
14f00 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
14f10 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
14f20 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67  ER_ERROR && pPag
14f30 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
14f40 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73  R_OPEN ){.    as
14f50 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
14f60 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
14f70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
14f80 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
14f90 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
14fa0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14fb0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
14fc0 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
14fd0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
14fe0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
14ff0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
15000 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
15010 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
15020 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
15030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15040 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
15050 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
15060 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74       pager_end_t
15070 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
15080 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, 0, 0);.    }.
15090 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
150a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
150b0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
150c0 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
150d0 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
150e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
150f0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
15100 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
15110 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
15120 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
15130 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
15140 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
15150 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
15160 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
15170 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
15180 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
15190 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
151a0 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
151b0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
151c0 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
151d0 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
151e0 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
151f0 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
15200 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
15210 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
15220 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
15230 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
15240 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
15250 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
15260 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
15270 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
15280 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
15290 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
152a0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
152b0 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
152c0 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
152d0 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
152e0 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
152f0 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
15300 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
15310 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
15320 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
15330 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
15340 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
15350 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
15360 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
15370 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
15380 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
15390 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
153a0 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
153b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
153c0 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
153d0 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
153e0 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
153f0 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
15400 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
15410 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
15420 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
15430 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
15440 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
15450 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
15460 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
15470 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
15480 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
15490 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
154a0 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
154b0 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
154c0 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
154d0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
154e0 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
154f0 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
15500 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15510 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
15520 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
15530 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
15540 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
15550 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
15560 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
15570 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
15580 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
15590 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
155a0 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
155b0 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
155c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
155d0 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
155e0 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
155f0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15600 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15610 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
15620 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
15630 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
15640 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
15650 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
15680 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15690 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
156a0 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
156b0 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
156c0 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
156d0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
156e0 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
156f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
15700 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61  S_CODEC./*.** Ma
15710 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62  ke sure the numb
15720 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
15730 69 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20  its is the same 
15740 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  in the destinati
15750 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69  on.** pager as i
15760 74 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72  t is in the sour
15770 63 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20  ce.  This comes 
15780 75 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d  up when a VACUUM
15790 20 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20   changes the.** 
157a0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
157b0 65 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22  ed bits to the "
157c0 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e  optimal" amount.
157d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
157e0 50 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76  PagerAlignReserv
157f0 65 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20  e(Pager *pDest, 
15800 50 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20  Pager *pSrc){.  
15810 69 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65  if( pDest->nRese
15820 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65  rve!=pSrc->nRese
15830 72 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74  rve ){.    pDest
15840 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72  ->nReserve = pSr
15850 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  c->nReserve;.   
15860 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
15870 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  (pDest);.  }.}.#
15880 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
15890 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
158a0 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
158b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
158c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
158d0 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
158e0 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
158f0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
15900 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
15910 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
15920 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
15930 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
15940 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
15950 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
15960 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
15970 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
15980 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
15990 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
159a0 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
159b0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
159c0 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
159d0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
159e0 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
159f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
15a00 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
15a10 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
15a20 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15a30 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
15a40 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
15a50 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15a60 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
15a70 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
15a80 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
15a90 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
15aa0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
15ab0 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
15ac0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
15ad0 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
15ae0 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
15af0 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
15b00 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
15b10 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
15b20 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
15b30 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
15b40 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
15b50 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
15b60 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
15b70 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
15b80 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
15b90 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
15ba0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
15bb0 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
15bc0 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
15bd0 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
15be0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
15bf0 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
15c00 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
15c10 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15c20 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
15c30 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
15c40 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
15c50 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
15c60 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
15c70 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
15c80 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
15c90 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15ca0 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
15cb0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
15cc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15cd0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
15ce0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
15cf0 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
15d00 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
15d10 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
15d20 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15d30 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
15d40 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
15d50 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
15d60 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
15d70 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
15d80 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
15d90 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
15da0 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
15db0 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
15dc0 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
15dd0 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
15de0 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
15df0 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
15e00 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
15e10 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
15e20 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
15e30 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
15e40 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
15e50 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
15e60 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
15e70 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
15e80 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
15e90 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
15ea0 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
15eb0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
15ec0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
15ed0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15ee0 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
15ef0 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
15f00 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
15f10 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
15f20 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
15f30 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
15f40 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
15f50 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
15f60 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
15f70 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
15f80 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
15f90 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
15fa0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15fc0 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
15fd0 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15fe0 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16000 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
16010 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
16020 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
16030 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16040 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
16050 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
16060 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
16070 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
16080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
16090 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
160a0 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
160b0 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
160c0 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
160d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
160e0 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
160f0 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
16100 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
16110 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
16120 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
16130 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
16140 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
16150 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
16160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16170 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16180 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
16190 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
161a0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
161b0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
161c0 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
161d0 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
161e0 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16200 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
16210 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
16220 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
16230 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
16240 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
16250 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
16260 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16270 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
16280 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16290 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
162a0 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
162b0 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
162c0 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
162d0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
162e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
162f0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
16300 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
16310 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
16320 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
16330 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
16340 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
16350 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
16360 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
16370 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
16380 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
16390 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
163a0 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
163b0 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
163c0 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
163d0 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
163e0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
163f0 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
16400 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
16410 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
16420 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
16430 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
16440 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
16450 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
16460 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
16470 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
16480 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
16490 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
164a0 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
164b0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
164c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
164d0 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
164e0 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
164f0 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
16500 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
16510 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
16520 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16530 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
16540 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16550 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
16560 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
16570 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
16580 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16590 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
165a0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
165b0 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
165c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
165d0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
165e0 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
165f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16600 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
16610 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
16620 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
16630 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
16640 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
16650 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
16660 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
16670 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16680 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16690 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
166a0 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
166b0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
166c0 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
166d0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
166e0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
166f0 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
16700 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
16710 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
16720 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
16730 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
16740 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
16750 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
16760 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
16770 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
16780 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
16790 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
167a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
167b0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
167c0 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
167d0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
167e0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
167f0 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
16800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16810 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
16820 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
16830 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
16840 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
16850 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
16860 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
16870 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
16880 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
16890 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
168a0 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
168b0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
168c0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
168d0 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
168e0 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
168f0 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
16900 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
16910 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16920 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
16930 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
16940 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
16950 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
16960 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
16970 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
16980 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
16990 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
169a0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
169b0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
169c0 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
169d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
169e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
169f0 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
16a00 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
16a10 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
16a20 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
16a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16a40 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
16a50 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
16a60 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16a70 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
16a80 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
16a90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16aa0 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
16ab0 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
16ac0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
16ad0 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
16ae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16af0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
16b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16b10 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
16b20 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
16b30 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69  back before duri
16b40 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
16b50 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
16b60 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
16b70 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
16b80 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
16b90 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
16ba0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
16bb0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
16bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16be0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
16bf0 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
16c00 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
16c10 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
16c20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
16c30 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
16c40 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
16c50 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
16c60 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
16c70 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
16c80 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
16c90 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
16ca0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16cb0 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
16cc0 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
16cd0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
16ce0 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
16cf0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
16d00 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
16d10 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
16d20 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
16d30 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
16d40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16d50 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
16d60 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
16d70 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
16d80 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
16d90 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
16da0 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
16db0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
16dc0 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
16dd0 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
16de0 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
16df0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
16e00 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
16e10 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
16e20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
16e30 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
16e40 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
16e50 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
16e60 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
16e70 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
16e80 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
16e90 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
16ea0 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
16eb0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
16ec0 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
16ed0 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
16ee0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
16ef0 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
16f00 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
16f10 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
16f20 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
16f30 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
16f40 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
16f50 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
16f60 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
16f70 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
16f80 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
16f90 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
16fa0 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
16fb0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
16fc0 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
16fd0 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
16fe0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
16ff0 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
17000 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
17010 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
17020 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
17030 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17040 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
17050 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
17060 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
17070 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
17080 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
17090 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
170a0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
170b0 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
170c0 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
170d0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
170e0 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
170f0 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
17100 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
17110 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
17120 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
17130 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
17140 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
17150 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
17160 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
17170 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
17180 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
17190 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
171a0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
171b0 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
171c0 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
171d0 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
171e0 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
171f0 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
17200 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
17210 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
17220 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
17230 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
17240 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
17250 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
17260 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
17270 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
17280 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17290 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
172a0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
172b0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
172c0 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
172d0 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
172e0 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
172f0 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
17300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
17310 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
17320 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
17330 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
17340 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
17350 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17360 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
17370 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
17380 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
17390 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
173a0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
173b0 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
173c0 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
173d0 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
173e0 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
173f0 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
17400 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
17410 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
17420 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
17430 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
17440 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
17450 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
17460 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
17470 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
17480 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
17490 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
174a0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
174b0 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
174c0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
174d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
174e0 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
174f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17500 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
17510 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
17520 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
17530 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
17540 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
17550 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
17560 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
17570 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g==0 );.  PAGERT
17580 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
17590 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
175a0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
175b0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
175c0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
175d0 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
175e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
175f0 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
17600 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
17610 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
17620 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
17630 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
17640 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
17650 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
17660 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
17670 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
17680 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
17690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
176a0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
176b0 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
176c0 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
176d0 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
176e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
176f0 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
17700 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17710 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
17720 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
17730 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
17740 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
17750 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
17760 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
17770 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
17780 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
17790 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
177a0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
177b0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
177c0 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
177d0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
177e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
177f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
17800 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
17810 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61  (u8 *)aData, pPa
17820 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
17830 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
17840 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
17850 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
17860 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
17870 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
17880 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17890 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
178a0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
178b0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
178c0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
178d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
178e0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
178f0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
17900 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
17910 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
17920 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17930 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
17940 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
17950 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17960 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
17970 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
17980 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
17990 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
179a0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
179b0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
179c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
179d0 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
179e0 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
179f0 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
17a00 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
17a10 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
17a20 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
17a30 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
17a40 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
17a50 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
17a60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
17a70 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
17a80 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
17a90 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
17aa0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
17ab0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
17ac0 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
17ad0 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
17ae0 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
17af0 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
17b00 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
17b10 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
17b20 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
17b30 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
17b40 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
17b50 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
17b60 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
17b70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
17b80 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
17b90 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
17ba0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
17bb0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
17bc0 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
17bd0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
17be0 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
17bf0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
17c00 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
17c10 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
17c20 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
17c30 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
17c40 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
17c50 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
17c60 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
17c70 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
17c80 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
17c90 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
17ca0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
17cb0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
17cc0 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
17cd0 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
17ce0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17cf0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
17d00 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
17d10 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
17d20 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17d30 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)==0 );.    pPa
17d40 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
17d50 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  |= SPILLFLAG_ROL
17d60 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  LBACK;.    rc = 
17d70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
17d80 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
17d90 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
17da0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
17db0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
17dc0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30  LAG_ROLLBACK)!=0
17dd0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17de0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
17df0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17e00 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  K;.    if( rc!=S
17e10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17e20 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66  n rc;.    pPg->f
17e30 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
17e40 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71  EED_READ;.    sq
17e50 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
17e60 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
17e70 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
17e80 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
17e90 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
17ea0 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
17eb0 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
17ec0 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
17ed0 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
17ee0 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
17ef0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
17f00 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
17f10 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
17f20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
17f30 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
17f40 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
17f50 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
17f60 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
17f70 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
17f80 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
17f90 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
17fa0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
17fb0 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
17fc0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
17fd0 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
17fe0 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
17ff0 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
18000 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
18010 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
18020 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
18030 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d  Pg);.    if( isM
18040 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53  ainJrnl && (!isS
18050 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73  avepnt || *pOffs
18060 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  et<=pPager->jour
18070 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20  nalHdr) ){.     
18080 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65   /* If the conte
18090 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
180a0 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f   were just resto
180b0 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  red from the mai
180c0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  n .      ** jour
180d0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
180e0 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ts content must 
180f0 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20  be as they were 
18100 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  when the .      
18110 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
18120 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
18130 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
18140 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61   can mark the pa
18150 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63  ge.      ** as c
18160 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72  lean, since ther
18170 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65  e will be no nee
18180 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75  d to write it ou
18190 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
181a0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
181b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
181c0 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
181d0 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
181e0 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
181f0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
18200 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
18210 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
18220 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
18230 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
18240 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
18250 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
18260 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
18270 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
18280 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
18290 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
182a0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
182b0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
182c0 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
182d0 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
182e0 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
182f0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
18300 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
18310 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
18320 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
18330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18340 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
18350 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
18360 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
18370 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
18380 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
18390 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
183a0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
183b0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
183c0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
183d0 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
183e0 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
183f0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
18400 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18410 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
18420 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
18430 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
18440 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
18450 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
18460 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
18470 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
18480 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
18490 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
184a0 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
184b0 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
184c0 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
184d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
184e0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
184f0 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
18500 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
18510 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
18520 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
18530 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
18540 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
18550 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
18560 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
18570 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
18580 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
18590 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
185a0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
185b0 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
185c0 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
185d0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
185e0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
185f0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
18600 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
18610 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
18620 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
18630 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
18640 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
18650 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
18660 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
18670 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
18680 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
18690 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  ->pgno, 3, rc=SQ
186a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
186b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
186c0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
186d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
186e0 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
186f0 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
18700 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
18710 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
18720 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
18730 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
18740 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
18750 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18760 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
18770 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
18780 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
18790 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
187a0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
187b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
187c0 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
187d0 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
187e0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
187f0 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
18800 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
18810 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
18820 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
18830 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
18840 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
18850 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
18860 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
18870 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
18880 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
18890 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
188a0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
188b0 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
188c0 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
188d0 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
188e0 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
188f0 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
18900 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
18910 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
18920 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
18930 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
18940 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
18950 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
18960 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
18970 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
18980 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
18990 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
189a0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
189b0 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
189c0 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
189d0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
189e0 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
189f0 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
18a00 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
18a10 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
18a20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
18a30 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
18a40 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
18a50 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
18a60 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
18a70 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
18a80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18a90 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
18aa0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
18ab0 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
18ac0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
18ad0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
18ae0 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
18af0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
18b00 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
18b10 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
18b20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18b30 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
18b40 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
18b50 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18b60 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
18b70 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
18b80 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
18b90 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
18ba0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
18bb0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
18bc0 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
18bd0 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
18be0 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
18bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
18c00 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
18c10 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
18c20 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
18c30 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
18c40 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
18c50 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
18c60 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
18c70 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
18c80 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
18c90 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
18ca0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
18cb0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
18cc0 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
18cd0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
18ce0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
18cf0 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
18d00 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
18d10 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
18d20 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
18d30 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
18d40 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
18d50 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
18d60 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
18d70 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
18d80 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
18d90 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
18da0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
18db0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
18dc0 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
18dd0 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
18de0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
18df0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
18e00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18e10 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
18e20 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
18e30 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
18e40 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
18e50 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
18e60 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
18e70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
18e80 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
18e90 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
18ea0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
18eb0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18ec0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
18ed0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18ef0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18f00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18f10 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
18f20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
18f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
18f40 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
18f50 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
18f60 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
18f70 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
18f80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18f90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18fa0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
18fb0 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
18fc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18fd0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
18fe0 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
18ff0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
19000 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19010 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
19020 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
19030 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
19040 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
19050 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
19060 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
19070 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
19080 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
19090 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
190a0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
190b0 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
190c0 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
190d0 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
190e0 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
190f0 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
19100 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
19110 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
19120 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
19130 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
19140 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
19150 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
19160 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19170 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
19180 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
19190 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
191a0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
191b0 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
191c0 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
191d0 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
191e0 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
191f0 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
19200 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
19210 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
19220 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
19230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
19240 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
19250 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
19260 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
19270 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
19280 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
19290 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
192a0 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
192b0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
192c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
192d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
192e0 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
192f0 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
19300 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19310 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
19320 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
19330 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
19340 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
19350 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
19360 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
19370 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
19380 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
19390 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
193a0 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
193b0 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
193c0 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
193d0 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
193e0 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
193f0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
19400 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19410 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
19420 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19440 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
19450 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
19460 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
19470 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
19480 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
19490 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
194a0 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
194b0 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
194c0 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
194d0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
194e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
194f0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19500 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ut;.  }.  zMaste
19510 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
19520 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
19530 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d  urnal+1];.  rc =
19540 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
19550 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
19560 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
19570 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
19580 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19590 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
195a0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61  aster_out;.  zMa
195b0 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
195c0 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b  terJournal] = 0;
195d0 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a  ..  zJournal = z
195e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
195f0 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
19600 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
19610 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
19620 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73   ){.    int exis
19630 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ts;.    rc = sql
19640 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
19650 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
19660 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
19670 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
19680 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
196a0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
196b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78      }.    if( ex
196c0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ists ){.      /*
196d0 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
196e0 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
196f0 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
19700 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
19710 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
19720 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
19730 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
19740 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
19750 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
19760 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
19770 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
19780 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
19790 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
197a0 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   c;.      int fl
197b0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
197c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
197d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
197e0 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20  RNAL);.      rc 
197f0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19800 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
19810 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
19820 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
19830 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19840 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19850 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19860 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
19870 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
19880 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
19890 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
198a0 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
198b0 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
198c0 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
198d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
198e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
198f0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19900 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a    }..      c = z
19910 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
19920 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
19930 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
19940 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29  0;.      if( c )
19950 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
19960 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
19970 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
19980 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19990 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
199a0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
199b0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
199c0 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b  }.    zJournal +
199d0 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
199e0 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
199f0 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33  .  }. .  sqlite3
19a00 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19a10 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19a20 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
19a30 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
19a40 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71  master_out:.  sq
19a50 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
19a60 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19a70 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
19a80 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19a90 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
19aa0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
19ab0 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73  ournal) );.    s
19ac0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
19ad0 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
19ae0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
19af0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19b00 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
19b10 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
19b20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19b30 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
19b40 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
19b50 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
19b60 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
19b70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
19b80 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
19b90 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
19ba0 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
19bb0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
19bc0 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
19bd0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19be0 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
19bf0 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65  pen, or the page
19c00 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68  r is not in eith
19c10 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f  er.** DBMOD or O
19c20 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20  PEN state, this 
19c30 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
19c40 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
19c50 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20  the size .** of 
19c60 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e  the file is chan
19c70 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
19c80 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
19c90 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
19ca0 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  ). .** If the fi
19cb0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  le on disk is cu
19cc0 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
19cd0 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
19ce0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
19cf0 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
19d00 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
19d10 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
19d20 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
19d30 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
19d40 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
19d50 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
19d60 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
19d70 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
19d80 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
19d90 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
19da0 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
19db0 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
19dc0 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
19dd0 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
19de0 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
19df0 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
19e00 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
19e10 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
19e20 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
19e30 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
19e40 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
19e50 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
19e60 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
19e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
19e80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
19e90 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
19ea0 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
19eb0 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
19ec0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
19ed0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
19ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19ef0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
19f00 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
19f10 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
19f20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
19f30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19f40 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
19f50 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
19f60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
19f70 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
19f80 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28    .  if( isOpen(
19f90 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20  pPager->fd) .   
19fa0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
19fb0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
19fc0 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
19fd0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
19fe0 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20  OPEN) .  ){.    
19ff0 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
1a000 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e   newSize;.    in
1a010 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65  t szPage = pPage
1a020 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1a030 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a040 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
1a050 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a  E_LOCK );.    /*
1a060 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
1a070 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
1a080 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
1a090 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1a0a0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1a0b0 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
1a0c0 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
1a0d0 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69  Size = szPage*(i
1a0e0 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
1a0f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a100 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d  && currentSize!=
1a110 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1a120 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65   if( currentSize
1a130 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  >newSize ){.    
1a140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a150 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
1a160 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b  r->fd, newSize);
1a170 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a180 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a   (currentSize+sz
1a190 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29  Page)<=newSize )
1a1a0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1a1b0 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70  pTmp = pPager->p
1a1c0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  TmpSpace;.      
1a1d0 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30    memset(pTmp, 0
1a1e0 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  , szPage);.     
1a1f0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
1a200 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d  wSize-szPage) ==
1a210 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
1a220 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1a230 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
1a240 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a  e) >  currentSiz
1a250 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e );.        rc 
1a260 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1a270 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d  (pPager->fd, pTm
1a280 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69  p, szPage, newSi
1a290 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  ze-szPage);.    
1a2a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1a2b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a2c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
1a2d0 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
1a2e0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1a2f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a310 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65  n a sanitized ve
1a320 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63  rsion of the sec
1a330 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66  tor-size of OS f
1a340 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a  ile pFile. The.*
1a350 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1a360 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1a370 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61  lie between 32 a
1a380 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  nd MAX_SECTOR_SI
1a390 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ZE..*/.int sqlit
1a3a0 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  e3SectorSize(sql
1a3b0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1a3c0 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20  ){.  int iRet = 
1a3d0 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
1a3e0 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ize(pFile);.  if
1a3f0 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20  ( iRet<32 ){.   
1a400 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d   iRet = 512;.  }
1a410 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41  else if( iRet>MA
1a420 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
1a430 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
1a440 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
1a450 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 );.    iRet = 
1a460 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
1a470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1a480 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  et;.}../*.** Set
1a490 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1a4a0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1a4b0 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20  ze variable for 
1a4c0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67  the given.** pag
1a4d0 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
1a4e0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1a4f0 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
1a500 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
1a510 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1a520 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f   file. The secto
1a530 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75  r size will be u
1a540 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72  sed .** to deter
1a550 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e  mine the size an
1a560 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a  d alignment of j
1a570 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e  ournal header an
1a580 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  d .** master jou
1a590 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69  rnal pointers wi
1a5a0 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75  thin created jou
1a5b0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
1a5c0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
1a5d0 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74  files the effect
1a5e0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a5f0 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  is always 512 by
1a600 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  tes..**.** Other
1a610 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65  wise, for non-te
1a620 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74  mporary files, t
1a630 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a640 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74  tor size is.** t
1a650 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1a660 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
1a670 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f  Size() method ro
1a680 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69  unded up to 32 i
1a690 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20  f.** it is less 
1a6a0 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e  than 32, or roun
1a6b0 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f  ded down to MAX_
1a6c0 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69  SECTOR_SIZE if i
1a6d0 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
1a6e0 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  than MAX_SECTOR_
1a6f0 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  SIZE..**.** If t
1a700 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20  he file has the 
1a710 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1a720 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a730 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
1a740 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63  set.** the effec
1a750 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a760 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20   to its minimum 
1a770 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68  value (512).  Th
1a780 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20  e purpose of.** 
1a790 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a7a0 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20  ze is to define 
1a7b0 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75  the "blast radiu
1a7c0 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  s" of bytes that
1a7d0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
1a7e0 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   if a crash occu
1a7f0 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  rs while writing
1a800 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74   to a single byt
1a810 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e  e in.** that ran
1a820 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f  ge.  But with PO
1a830 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a840 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64  E, the blast rad
1a850 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28  ius is zero.** (
1a860 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57  that is what POW
1a870 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a880 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d   means), so we m
1a890 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74  inimize the sect
1a8a0 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72  or.** size.  For
1a8b0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
1a8c0 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  tibility of the 
1a8d0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a8e0 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a   file format,.**
1a8f0 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63   we cannot reduc
1a900 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
1a910 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f  sector size belo
1a920 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  w 512..*/.static
1a930 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
1a940 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
1a950 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
1a960 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1a970 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1a980 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  File );..  if( p
1a990 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
1a9a0 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
1a9b0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a9c0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1a9d0 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) & .           
1a9e0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1a9f0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1aa00 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ITE)!=0.  ){.   
1aa10 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
1aa20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
1aa30 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1aa40 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
1aa50 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
1aa60 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
1aa70 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
1aa80 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
1aa90 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
1aaa0 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
1aab0 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  lt. */.    pPage
1aac0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1aad0 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  512;.  }else{.  
1aae0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
1aaf0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65  Size = sqlite3Se
1ab00 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
1ab10 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  >fd);.  }.}../*.
1ab20 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
1ab30 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
1ab40 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1ab50 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
1ab60 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
1ab70 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
1ab80 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
1ab90 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
1aba0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1abb0 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
1abc0 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
1abd0 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
1abe0 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
1abf0 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
1ac00 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
1ac10 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1ac20 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1ac30 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
1ac40 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
1ac50 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
1ac60 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
1ac70 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
1ac80 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
1ac90 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
1aca0 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
1acb0 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
1acc0 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
1acd0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1ace0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1acf0 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
1ad00 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
1ad10 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
1ad20 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
1ad30 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
1ad40 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1ad50 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1ad60 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
1ad70 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
1ad80 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
1ad90 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
1ada0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1adb0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1adc0 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
1add0 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
1ade0 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
1adf0 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
1ae00 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
1ae10 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1ae20 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1ae30 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  s the page size.
1ae40 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70  .**  (7)  zero p
1ae50 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68  adding out to th
1ae60 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69  e next sector si
1ae70 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72  ze..**  (8)  Zer
1ae80 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
1ae90 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
1aea0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
1aeb0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1aec0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1aed0 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
1aee0 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
1aef0 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
1af00 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
1af10 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
1af20 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
1af30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1af40 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
1af50 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76  rst 7 items abov
1af60 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
1af70 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1af80 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
1af90 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a  f the 8th item..
1afa0 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
1afb0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
1afc0 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
1afd0 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
1afe0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
1aff0 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
1b000 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1b010 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
1b020 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
1b030 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
1b040 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
1b050 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1b060 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
1b070 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
1b080 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
1b090 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
1b0a0 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
1b0b0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1b0c0 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
1b0d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1b0e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
1b0f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
1b100 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
1b110 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
1b120 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
1b130 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
1b140 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
1b150 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
1b160 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
1b170 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
1b180 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
1b190 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
1b1a0 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
1b1b0 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
1b1c0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
1b1d0 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1b1e0 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
1b1f0 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
1b200 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
1b210 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
1b220 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
1b230 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
1b240 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
1b250 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
1b260 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
1b270 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
1b280 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
1b290 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
1b2a0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
1b2b0 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
1b2c0 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
1b2d0 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
1b2e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
1b2f0 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
1b300 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
1b310 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
1b320 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
1b330 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
1b340 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
1b350 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
1b360 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
1b370 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
1b380 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
1b390 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
1b3a0 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
1b3b0 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
1b3c0 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
1b3d0 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
1b3e0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
1b3f0 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
1b400 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
1b410 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
1b420 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1b430 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
1b440 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
1b450 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
1b460 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
1b470 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
1b480 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
1b490 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
1b4a0 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
1b4b0 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
1b4c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1b4d0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ned..**.** The i
1b4e0 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69  sHot parameter i
1b4f0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
1b500 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1b510 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ollback a journa
1b520 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20  l.** that might 
1b530 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  be a hot journal
1b540 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20  .  Or, it could 
1b550 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  be that the jour
1b560 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65  nal is .** prese
1b570 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rved because of 
1b580 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
1b590 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f  IST or JOURNALMO
1b5a0 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20  DE_TRUNCATE..** 
1b5b0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  If the journal r
1b5c0 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65  eally is hot, re
1b5d0 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61  set the pager ca
1b5e0 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e  che prior rollin
1b5f0 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f  g.** back any co
1b600 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a  ntent.  If the j
1b610 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79  ournal is merely
1b620 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20   persistent, no 
1b630 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64  reset is.** need
1b640 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1b650 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
1b660 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1b670 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
1b680 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1b690 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
1b6a0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
1b6b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b6c0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1b6d0 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
1b6e0 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b700 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
1b710 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
1b720 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b740 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
1b750 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
1b760 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
1b770 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b780 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
1b790 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
1b7a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1b7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b7c0 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
1b7d0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b7e0 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
1b7f0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1b800 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1b810 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
1b820 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
1b830 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
1b840 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
1b850 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
1b860 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64  ny */.  int need
1b870 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20  PagerReset;     
1b880 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
1b890 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  t page prior to 
1b8a0 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62  first page rollb
1b8b0 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c  ack */.  int nPl
1b8c0 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20  ayback = 0;     
1b8d0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1b8e0 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f  r of pages resto
1b8f0 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  red from journal
1b900 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
1b910 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
1b920 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
1b930 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
1b940 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
1b950 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
1b960 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
1b970 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1b980 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
1b990 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1b9a0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
1b9b0 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
1b9c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b9d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1b9e0 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
1b9f0 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
1ba00 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
1ba10 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
1ba20 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
1ba30 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
1ba40 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1ba50 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
1ba60 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
1ba70 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
1ba80 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
1ba90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1baa0 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
1bab0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
1bac0 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
1bad0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1bae0 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
1baf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
1bb00 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
1bb10 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
1bb20 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
1bb30 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
1bb40 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
1bb50 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
1bb60 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
1bb70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1bb80 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
1bb90 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
1bba0 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
1bbb0 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
1bbc0 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1bbd0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1bbe0 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1bbf0 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1bc00 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1bc10 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1bc20 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1bc30 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1bc40 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1bc50 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1bc60 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1bc70 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1bc80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bc90 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1bca0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1bcb0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1bcc0 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1bcd0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1bce0 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1bcf0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1bd00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1bd10 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1bd20 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1bd30 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1bd40 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1bd50 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1bd60 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1bd70 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1bd80 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1bd90 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1bda0 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1bdb0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1bdc0 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1bdd0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1bde0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1bdf0 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1be00 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1be10 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1be20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1be30 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1be40 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1be50 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1be60 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1be70 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1be80 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1be90 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1bea0 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1beb0 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1bec0 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1bed0 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1bee0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1bef0 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1bf00 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1bf10 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1bf20 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1bf30 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1bf40 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1bf50 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1bf60 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1bf70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bf80 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1bf90 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1bfa0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1bfb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1bfc0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1bfd0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1bfe0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1bff0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1c000 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1c010 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1c020 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1c030 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1c040 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1c050 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c060 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1c070 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1c080 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1c090 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1c0a0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1c0b0 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1c0c0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1c0d0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1c0e0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1c0f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c100 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1c110 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c120 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c130 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1c140 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1c150 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1c160 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1c170 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1c180 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1c190 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1c1a0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1c1b0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1c1c0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1c1d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1c1e0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1c1f0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1c200 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1c210 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1c220 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1c230 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1c240 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1c250 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1c260 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1c270 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1c280 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1c290 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1c2a0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1c2b0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1c2c0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1c2d0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1c2e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1c2f0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1c300 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1c310 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1c320 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1c330 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1c340 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1c350 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1c360 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1c370 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1c380 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1c390 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1c3a0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1c3b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1c3c0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1c3d0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1c3e0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1c3f0 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1c400 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1c410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1c420 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c430 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1c440 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1c450 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1c460 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1c470 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1c480 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1c490 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1c4a0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1c4b0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1c4c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1c4d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c4e0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1c4f0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1c500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1c510 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1c520 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1c530 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1c540 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1c550 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1c560 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1c570 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1c580 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1c590 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1c5a0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1c5b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1c5c0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1c5d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1c5e0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1c5f0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1c600 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1c610 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1c620 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1c630 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1c640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1c650 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1c660 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1c670 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c680 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1c690 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c6a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c6b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c6c0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1c6d0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1c6e0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1c6f0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1c700 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1c710 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1c720 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1c730 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1c740 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1c750 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1c760 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1c770 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1c780 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1c790 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1c7a0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1c7b0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1c7c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1c7d0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1c7e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c7f0 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1c800 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c810 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50  OK ){.        nP
1c820 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  layback++;.     
1c830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c840 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1c850 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1c860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c870 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1c880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c890 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1c8a0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1c8b0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c8c0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1c8d0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1c8e0 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1c8f0 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1c900 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1c910 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1c920 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1c930 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1c940 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1c950 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1c960 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1c970 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1c980 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1c990 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1c9a0 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1c9b0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1c9c0 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1c9d0 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1c9e0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1c9f0 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1ca00 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1ca10 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1ca20 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1ca30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ca40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1ca50 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ca60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ca70 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1ca80 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1ca90 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1caa0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1cab0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1cac0 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1cad0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1cae0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1caf0 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1cb00 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1cb10 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1cb20 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1cb30 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1cb40 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1cb50 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1cb60 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1cb70 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1cb80 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1cb90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1cba0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1cbb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cbc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1cbd0 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1cbe0 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1cbf0 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1cc00 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1cc10 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1cc20 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1cc30 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1cc40 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1cc50 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1cc60 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1cc70 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1cc80 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1cc90 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1cca0 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1ccb0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1ccc0 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1ccd0 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1cce0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1ccf0 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1cd00 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ied..  */.#ifdef
1cd10 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1cd20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
1cd30 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1cd40 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1cd50 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
1cd60 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
1cd70 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
1cd80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1cd90 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62  /* If this playb
1cda0 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67  ack is happening
1cdb0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1cdc0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
1cdd0 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c   IO or .  ** mal
1cde0 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f  loc error that o
1cdf0 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68  ccurred after th
1ce00 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1ce10 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74   was updated but
1ce20 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68   .  ** before th
1ce30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
1ce40 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  s committed, the
1ce50 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1ce60 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  nter .  ** modif
1ce70 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74  ication may just
1ce80 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72   have been rever
1ce90 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70  ted. If this hap
1cea0 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76  pens in exclusiv
1ceb0 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68  e .  ** mode, th
1cec0 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72  en subsequent tr
1ced0 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f  ansactions perfo
1cee0 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e  rmed by the conn
1cef0 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a  ection will not.
1cf00 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20    ** update the 
1cf10 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1cf20 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20  t all. This may 
1cf30 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e  lead to cache in
1cf40 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a  consistency.  **
1cf50 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74   problems for ot
1cf60 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74  her processes at
1cf70 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1cf80 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a  he future. So, j
1cf90 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ust.  ** in case
1cfa0 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e   this has happen
1cfb0 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68  ed, clear the ch
1cfc0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
1cfd0 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  ag now..  */.  p
1cfe0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1cff0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1d000 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1d010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d020 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
1d030 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1d040 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
1d050 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1d060 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1d070 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1d080 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1d090 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d0a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d0b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d0c0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28  QLITE_OK.   && (
1d0d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1d0e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1d0f0 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1d100 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1d110 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
1d120 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1d130 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
1d140 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1d160 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1d170 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
1d180 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c  Master[0]!='\0',
1d190 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   0);.    testcas
1d1a0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1d1b0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1d1c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1d1d0 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
1d1e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1d1f0 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
1d200 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
1d210 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1d220 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
1d230 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
1d240 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
1d250 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1d260 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
1d270 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d280 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
1d290 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1d2a0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1d2b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1d2c0 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50   if( isHot && nP
1d2d0 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  layback ){.    s
1d2e0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
1d2f0 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
1d300 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f  _ROLLBACK, "reco
1d310 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20 66  vered %d pages f
1d320 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20  rom %s",.       
1d330 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61           nPlayba
1d340 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ck, pPager->zJou
1d350 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rnal);.  }..  /*
1d360 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1d370 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1d380 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1d390 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1d3a0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1d3b0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1d3c0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1d3d0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1d3e0 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1d3f0 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1d400 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1d410 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1d420 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1d430 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1d440 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d450 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1d460 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1d470 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1d480 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d490 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1d4a0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1d4b0 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1d4c0 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1d4d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1d4e0 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1d4f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d500 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1d510 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1d520 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1d530 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1d540 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1d550 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1d560 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1d570 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1d580 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1d590 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1d5a0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1d5b0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1d5c0 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1d5d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1d5e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1d5f0 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1d600 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33  e(PgHdr *pPg, u3
1d610 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67  2 iFrame){.  Pag
1d620 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1d630 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1d640 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1d650 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1d660 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
1d670 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
1d680 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1d690 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
1d6a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d6b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1d6c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1d6d0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1d6e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1d6f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1d700 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1d710 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d720 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1d730 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1d740 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1d750 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1d760 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1d770 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28  E_OMIT_WAL.  if(
1d780 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f   iFrame ){.    /
1d790 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68  * Try to pull th
1d7a0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1d7b0 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e  write-ahead log.
1d7c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1d7d0 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65  ite3WalReadFrame
1d7e0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69  (pPager->pWal, i
1d7f0 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67  Frame, pgsz, pPg
1d800 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  ->pData);.  }els
1d810 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1d820 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1d830 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1d840 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1d850 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1d860 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1d870 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1d880 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  sz, iOffset);.  
1d890 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d8a0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1d8b0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1d8c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d8d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f  .  }..  if( pgno
1d8e0 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1d8f0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1d900 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1d910 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1d920 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1d930 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1d940 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1d950 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1d960 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1d970 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1d980 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1d990 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1d9a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1d9b0 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1d9c0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1d9d0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1d9e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1d9f0 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1da00 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1da10 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1da20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1da30 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1da40 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1da50 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1da60 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1da70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1da80 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1da90 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1daa0 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1dab0 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1dac0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1dad0 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1dae0 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1daf0 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1db00 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1db10 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1db20 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1db30 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1db40 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1db50 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31  noise equaling 1
1db60 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
1db70 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
1db80 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
1db90 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
1dba0 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
1dbb0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
1dbc0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1dbd0 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
1dbe0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1dbf0 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
1dc00 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
1dc10 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
1dc20 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
1dc30 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1dc40 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1dc50 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
1dc60 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1dc70 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
1dc80 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
1dc90 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
1dca0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
1dcb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20  QLITE_NOMEM);.. 
1dcc0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1dcd0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1dce0 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1dcf0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1dd00 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1dd10 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1dd20 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1dd30 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1dd40 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1dd50 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1dd70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1dd80 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1dd90 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
1dda0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ddb0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76  .** Update the v
1ddc0 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e  alue of the chan
1ddd0 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66  ge-counter at of
1dde0 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20  fsets 24 and 92 
1ddf0 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  in.** the header
1de00 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20   and the sqlite 
1de10 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
1de20 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a  t offset 96..**.
1de30 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e  ** This is an un
1de40 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
1de50 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68  te.  See also th
1de60 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  e pager_incr_cha
1de70 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20  ngecounter().** 
1de80 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e  routine which on
1de90 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1dea0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66  hange-counter if
1deb0 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61   the update is a
1dec0 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65  ctually.** neede
1ded0 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64  d, as determined
1dee0 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e   by the pPager->
1def0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1df00 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a  state variable..
1df10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1df20 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1df30 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a  ecounter(PgHdr *
1df40 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e  pPg){.  u32 chan
1df50 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f  ge_counter;..  /
1df60 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1df70 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1df80 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1df90 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1dfa0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1dfb0 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1dfc0 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50  yte((u8*)pPg->pP
1dfd0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1dfe0 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73  )+1;.  put32bits
1dff0 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e000 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
1e010 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  counter);..  /* 
1e020 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
1e030 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
1e040 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
1e050 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a  ..99 and in.  **
1e060 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
1e070 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
1e080 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
1e090 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
1e0a0 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69  ber.  ** is vali
1e0b0 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  d. */.  put32bit
1e0c0 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1e0d0 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65  Data)+92, change
1e0e0 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74  _counter);.  put
1e0f0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1e100 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  Pg->pData)+96, S
1e110 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
1e120 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  MBER);.}..#ifnde
1e130 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1e140 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  L./*.** This fun
1e150 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1e160 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
1e170 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  age that has alr
1e180 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72  eady been .** wr
1e190 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c  itten into the l
1e1a0 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57  og file when a W
1e1b0 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1e1c0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1e1d0 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20  * Parameter iPg 
1e1e0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
1e1f0 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e  er of said page.
1e200 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65   The pCtx argume
1e210 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c  nt .** is actual
1e220 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
1e230 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1e240 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ure..**.** If pa
1e250 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e  ge iPg is presen
1e260 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  t in the cache, 
1e270 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  and has no outst
1e280 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
1e290 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63  s,.** it is disc
1e2a0 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  arded. Otherwise
1e2b0 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  , if there are o
1e2c0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
1e2d0 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65  anding.** refere
1e2e0 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63  nces, the page c
1e2f0 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64  ontent is reload
1e300 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1e310 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  base. If the.** 
1e320 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61  attempt to reloa
1e330 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1e340 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
1e350 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c  equired and fail
1e360 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  s, .** return an
1e370 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1e380 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
1e390 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
1e3a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64  tic int pagerUnd
1e3b0 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  oCallback(void *
1e3c0 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b  pCtx, Pgno iPg){
1e3d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e3e0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1e3f0 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1e400 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20  *)pCtx;.  PgHdr 
1e410 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
1e420 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1e430 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20  ger) );.  pPg = 
1e440 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1e450 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
1e460 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1e470 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1e480 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
1e490 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
1e4a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1e4b0 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
1e4c0 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46  se{.      u32 iF
1e4d0 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rame = 0;.      
1e4e0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1e4f0 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
1e500 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  >pWal, pPg->pgno
1e510 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
1e520 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e530 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e540 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1e550 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
1e560 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1e570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e580 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e590 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1e5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1e5b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
1e5c0 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20  otNull(pPg);.   
1e5d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1e5e0 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1e5f0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1e600 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1e610 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1e620 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1e630 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1e640 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1e650 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1e660 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1e670 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1e680 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1e690 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1e6a0 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1e6b0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1e6c0 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1e6d0 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1e6e0 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1e6f0 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1e700 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1e710 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1e720 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1e730 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1e740 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1e750 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1e760 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1e770 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1e780 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1e790 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1e7a0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1e7b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1e7c0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1e7d0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1e7e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e7f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e800 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1e810 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1e820 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1e830 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1e840 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1e850 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1e860 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e890 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1e8a0 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e8c0 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1e8d0 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1e8e0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1e8f0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1e900 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1e910 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1e920 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1e930 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1e940 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1e950 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1e960 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1e970 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1e980 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1e990 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1e9a0 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1e9b0 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1e9c0 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1e9d0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1e9e0 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1e9f0 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1ea00 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1ea10 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1ea20 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1ea30 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1ea40 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1ea50 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1ea60 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1ea70 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1ea80 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1ea90 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1eaa0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1eab0 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1eac0 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1ead0 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1eae0 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1eaf0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1eb00 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1eb10 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1eb20 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1eb30 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1eb40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1eb50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1eb60 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1eb70 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1eb80 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1eb90 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1eba0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1ebb0 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1ebc0 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1ebd0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1ebe0 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1ebf0 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1ec00 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1ec10 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1ec20 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1ec30 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1ec40 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1ec50 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1ec60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1ec70 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1ec80 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1ec90 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1eca0 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1ecb0 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1ecc0 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1ecd0 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1ece0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1ecf0 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1ed00 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1ed10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ed20 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1ed30 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1ed60 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1ed70 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed90 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1eda0 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1edb0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1edc0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1edd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ede0 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1edf0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1ee00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1ee20 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1ee30 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee50 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1ee60 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50   in pList */.  P
1ee70 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ee90 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1eea0 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61  er pages */..  a
1eeb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1eec0 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1eed0 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1eee0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1eef0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1ef00 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1ef10 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1ef20 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1ef30 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1ef40 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1ef50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ef60 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1ef70 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1ef80 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1ef90 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1efa0 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1efb0 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1efc0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1efd0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1efe0 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1eff0 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1f000 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1f010 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1f020 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1f030 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1f040 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1f050 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1f060 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1f070 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1f080 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1f090 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1f0a0 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1f0b0 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1f0c0 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65      PgHdr **ppNe
1f0d0 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20  xt = &pList;.   
1f0e0 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
1f0f0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70  for(p=pList; (*p
1f100 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70  pNext = p)!=0; p
1f110 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1f120 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d     if( p->pgno<=
1f130 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  nTruncate ){.   
1f140 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70       ppNext = &p
1f150 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
1f160 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20    nList++;.     
1f170 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1f180 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20  ert( pList );.  
1f190 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74  }else{.    nList
1f1a0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 1;.  }.  pPag
1f1b0 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
1f1c0 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e  STAT_WRITE] += n
1f1d0 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69  List;..  if( pLi
1f1e0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
1f1f0 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1f200 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
1f210 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f220 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e  lFrames(pPager->
1f230 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61  pWal, .      pPa
1f240 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
1f250 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c  List, nTruncate,
1f260 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65   isCommit, pPage
1f270 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  r->walSyncFlags.
1f280 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
1f290 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1f2a0 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
1f2b0 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1f2c0 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1f2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1f2e0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1f2f0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70  r->pBackup, p->p
1f300 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44  gno, (u8 *)p->pD
1f310 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1f320 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1f330 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69  HECK_PAGES.  pLi
1f340 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1f350 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1f360 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1f370 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f380 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f390 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
1f3a0 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e  hash(p);.  }.#en
1f3b0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1f3c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
1f3d0 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
1f3e0 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a  ion on the WAL..
1f3f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f400 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61  ne used to be ca
1f410 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53  lled "pagerOpenS
1f420 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75  napshot()" becau
1f430 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c  se it essentiall
1f440 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61  y.** makes a sna
1f450 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74  pshot of the dat
1f460 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72  abase at the cur
1f470 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69  rent point in ti
1f480 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73  me and preserves
1f490 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f  .** that snapsho
1f4a0 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
1f4b0 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65   reader in spite
1f4c0 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79   of concurrently
1f4d0 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f   changes by.** o
1f4e0 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20  ther writers or 
1f4f0 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a  checkpointers..*
1f500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f510 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
1f520 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
1f530 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f560 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1f570 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20   changed = 0;   
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f590 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75  True if cache mu
1f5a0 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a  st be reset */..
1f5b0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1f5c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1f5d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f5e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f5f0 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
1f600 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
1f610 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73  EADER );..  /* s
1f620 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1f630 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61  Transaction() wa
1f640 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72  s not called for
1f650 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20   the previous.  
1f660 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1f670 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
1f680 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61  XCLUSIVE.  So ca
1f690 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77  ll it now.  If w
1f6a0 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f  e.  ** are in lo
1f6b0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41  cking_mode=NORMA
1f6c0 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20  L and EndRead() 
1f6d0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  was previously c
1f6e0 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  alled,.  ** the 
1f6f0 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69  duplicate call i
1f700 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  s harmless..  */
1f710 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  .  sqlite3WalEnd
1f720 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f730 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1f740 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f750 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  lBeginReadTransa
1f760 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1f770 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20  al, &changed);. 
1f780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f790 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b  OK || changed ){
1f7a0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
1f7b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1f7c0 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
1f7d0 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
1f7e0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
1f7f0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
1f800 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1f810 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1f820 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f830 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1f840 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f  e transition fro
1f850 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  m PAGER_OPEN.** 
1f860 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
1f870 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69  state to determi
1f880 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ne the size of t
1f890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f8a0 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73  .** in pages (as
1f8b0 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20  suming the page 
1f8c0 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73  size currently s
1f8d0 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70  tored in Pager.p
1f8e0 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20  ageSize)..**.** 
1f8f0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
1f900 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
1f910 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1f920 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1f930 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67  tabase.** in pag
1f940 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
1f950 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69  *pnPage. Otherwi
1f960 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
1f970 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51  e (perhaps.** SQ
1f980 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1f990 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
1f9a0 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
1f9b0 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
1f9c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f9d0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1f9e0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
1f9f0 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
1fa00 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1fa10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1fa20 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1fa30 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1fa40 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c  /* Query the WAL
1fa50 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20   sub-system for 
1fa60 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1fa70 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65  e. The WalDbsize
1fa80 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ().  ** function
1fa90 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   returns zero if
1faa0 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20   the WAL is not 
1fab0 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72  open (i.e. Pager
1fac0 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20  .pWal==0), or.  
1fad0 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
1fae0 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  se size is not a
1faf0 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61  vailable. The da
1fb00 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1fb10 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ot.  ** availabl
1fb20 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
1fb30 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65  ub-system if the
1fb40 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70   log file is emp
1fb50 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61  ty or.  ** conta
1fb60 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d  ins no valid com
1fb70 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
1fb80 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
1fb90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1fba0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1fbb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1fbc0 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1fbd0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67  D_LOCK );.  nPag
1fbe0 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62  e = sqlite3WalDb
1fbf0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
1fc00 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  l);..  /* If the
1fc10 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1fc20 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1fc30 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1fc40 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  e from the.  ** 
1fc50 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20  WAL sub-system, 
1fc60 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61  determine the pa
1fc70 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65 64 20  ge counte based 
1fc80 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20  on the size of. 
1fc90 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1fca0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73   file.  If the s
1fcb0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1fcc0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
1fcd0 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  an.  ** integer 
1fce0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
1fcf0 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64  page-size, round
1fd00 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   up the result..
1fd10 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1fd20 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
1fd30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1fd40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fd50 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
1fd60 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
1fd70 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1fd80 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1fd90 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1fda0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1fdb0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1fdc0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1fdd0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1fde0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
1fdf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fe00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fe10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fe20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
1fe30 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
1fe40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fe50 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
1fe60 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
1fe70 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1fe80 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1fe90 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1fea0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1feb0 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1fec0 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1fed0 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1fee0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1fef0 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1ff00 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1ff10 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1ff20 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1ff30 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1ff40 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1ff50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1ff60 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1ff70 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1ff80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1ff90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1ffa0 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
1ffb0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1ffc0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1ffd0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1ffe0 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
1fff0 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
20000 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
20010 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
20020 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
20030 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
20040 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
20050 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
20060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20070 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
20080 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20090 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
200a0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
200b0 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
200c0 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
200d0 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
200e0 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
200f0 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
20100 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
20110 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
20120 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
20130 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
20140 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
20150 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
20160 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
20170 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20180 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
20190 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
201a0 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
201b0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
201c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
201d0 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
201e0 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
201f0 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
20200 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
20210 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
20220 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
20230 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
20240 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
20250 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
20260 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
20270 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
20280 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
20290 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
202a0 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
202b0 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
202c0 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
202d0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
202e0 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
202f0 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
20300 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
20310 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20320 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20330 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
20340 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
20350 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
20360 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
20370 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
20380 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
20390 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
203a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
203b0 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
203c0 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
203d0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
203e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
203f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20400 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
20410 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
20420 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
20430 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20440 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20450 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
20460 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20470 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
20480 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
20490 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
204a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
204b0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
204c0 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
204d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
204e0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
204f0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
20500 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
20510 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
20520 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
20530 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
20540 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
20550 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
20560 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20580 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
20590 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
205a0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
205b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
205c0 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
205d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
205e0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
205f0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
20600 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
20610 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
20620 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20630 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
20640 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20650 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
20660 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
20670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20680 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20690 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
206a0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
206b0 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
206c0 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
206d0 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
206e0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
206f0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
20700 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
20710 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
20720 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
20730 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
20740 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
20750 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
20760 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
20770 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
20780 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
20790 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
207a0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
207b0 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
207c0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
207d0 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
207e0 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
207f0 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
20800 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
20810 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
20820 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
20830 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
20840 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
20850 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
20860 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
20870 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20880 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
20890 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
208a0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
208b0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
208c0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
208d0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
208e0 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
208f0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20900 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
20910 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20920 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
20930 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
20940 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
20950 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
20960 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
20970 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
20980 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
20990 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
209a0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
209b0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
209c0 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
209d0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
209e0 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
209f0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20a00 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
20a10 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
20a20 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
20a30 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
20a40 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
20a50 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
20a60 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
20a70 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
20a80 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
20a90 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
20aa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20ab0 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
20ac0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
20ad0 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
20ae0 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
20af0 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
20b00 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
20b10 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
20b20 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
20b30 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
20b40 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
20b50 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
20b60 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
20b70 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
20b80 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
20b90 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
20ba0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
20bb0 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
20bc0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
20bd0 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
20be0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
20bf0 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
20c00 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
20c10 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
20c20 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
20c30 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
20c40 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
20c50 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
20c60 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
20c70 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
20c80 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
20c90 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
20ca0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
20cb0 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
20cc0 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
20cd0 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
20ce0 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
20cf0 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
20d00 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
20d10 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
20d20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
20d30 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
20d40 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
20d50 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
20d60 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
20d70 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
20d80 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
20d90 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
20da0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
20db0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
20dc0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
20dd0 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
20de0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
20df0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
20e00 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
20e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
20e20 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
20e30 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
20e40 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
20e50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20e60 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
20e70 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
20e80 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
20e90 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
20ea0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
20eb0 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
20ec0 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
20ed0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20ee0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
20ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20f00 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
20f10 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
20f20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
20f30 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
20f40 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
20f50 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
20f60 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
20f70 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20f80 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
20f90 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
20fa0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20fb0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
20fc0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
20fd0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
20fe0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20ff0 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
21000 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
21010 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
21020 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
21030 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
21040 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
21050 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
21060 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
21070 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
21080 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
21090 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
210a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
210b0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
210c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
210d0 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
210e0 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
210f0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
21100 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
21110 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
21120 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
21130 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21140 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
21150 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
21160 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
21170 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
21180 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
21190 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
211a0 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
211b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
211c0 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
211d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
211e0 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
211f0 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
21200 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21210 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
21220 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
21230 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
21240 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
21250 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
21260 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
21270 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
21280 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
21290 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
212a0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
212b0 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
212c0 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
212d0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
212e0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
212f0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
21300 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
21310 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
21320 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
21330 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
21340 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
21350 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
21360 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
21370 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
21380 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
21390 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
213a0 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
213b0 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
213c0 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
213d0 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
213e0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
213f0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21400 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
21410 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21420 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
21430 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
21440 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
21450 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
21460 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
21470 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
21480 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
21490 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
214a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
214b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
214c0 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
214d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
214e0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
214f0 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
21500 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
21510 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
21520 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21530 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
21550 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21560 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
21570 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
21580 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
21590 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
215a0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
215b0 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
215c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
215d0 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
215e0 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
215f0 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
21600 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21610 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
21620 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
21630 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
21640 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
21650 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
21660 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
21670 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
21680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21690 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
216a0 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
216b0 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
216c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
216d0 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
216e0 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
216f0 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
21700 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
21710 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
21720 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
21730 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
21740 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
21750 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
21760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21770 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
21780 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
21790 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
217a0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
217b0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
217c0 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
217d0 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
217e0 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
217f0 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
21800 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
21810 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
21820 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
21830 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
21840 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
21850 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
21860 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
21870 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
21880 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
21890 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
218a0 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
218b0 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
218c0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
218d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
218e0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
218f0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
21900 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
21910 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
21920 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
21930 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
21940 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
21950 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
21960 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
21970 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
21980 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
21990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
219a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
219b0 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
219c0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
219d0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
219e0 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
219f0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
21a00 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
21a10 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
21a20 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
21a30 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
21a40 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
21a50 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
21a60 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
21a70 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
21a80 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
21a90 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
21aa0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
21ab0 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
21ac0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
21ad0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
21ae0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
21af0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21b00 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
21b10 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
21b20 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
21b30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21b40 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
21b50 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21b60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21b70 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
21b80 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
21b90 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
21ba0 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
21bb0 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
21bc0 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
21bd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21be0 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
21bf0 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
21c00 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
21c10 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
21c20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
21c30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
21c40 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
21c50 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
21c60 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
21c70 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21c80 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21c90 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
21ca0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
21cb0 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
21cc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21cd0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
21ce0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
21cf0 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
21d00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
21d10 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
21d20 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
21d30 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
21d40 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62  are allowed.** b
21d50 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
21d60 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61   to recycle clea
21d70 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67  n and unused pag
21d80 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
21d90 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
21da0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
21db0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
21dc0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
21dd0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
21de0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
21df0 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
21e00 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
21e10 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
21e20 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
21e30 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  t are allowed.**
21e40 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
21e50 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65  ng to spill page
21e60 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  s to journal..*/
21e70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21e80 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61  rSetSpillsize(Pa
21e90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21ea0 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75   mxPage){.  retu
21eb0 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
21ec0 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61  SetSpillsize(pPa
21ed0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
21ee0 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
21ef0 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43  Invoke SQLITE_FC
21f00 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61  NTL_MMAP_SIZE ba
21f10 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65  sed on the curre
21f20 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d  nt value of szMm
21f30 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ap..*/.static vo
21f40 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  id pagerFixMapli
21f50 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
21f60 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  r){.#if SQLITE_M
21f70 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
21f80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
21f90 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  d = pPager->fd;.
21fa0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29    if( isOpen(fd)
21fb0 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73   && fd->pMethods
21fc0 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b  ->iVersion>=3 ){
21fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
21fe0 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20  64 sz;.    sz = 
21ff0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a  pPager->szMmap;.
22000 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65      pPager->bUse
22010 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a  Fetch = (sz>0);.
22020 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
22030 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
22040 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
22050 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c  FCNTL_MMAP_SIZE,
22060 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   &sz);.  }.#endi
22070 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  f.}../*.** Chang
22080 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  e the maximum si
22090 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79  ze of any memory
220a0 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66   mapping made of
220b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
220c0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
220d0 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
220e0 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
220f0 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  er, sqlite3_int6
22100 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61  4 szMmap){.  pPa
22110 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a  ger->szMmap = sz
22120 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78  Mmap;.  pagerFix
22130 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
22140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
22150 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
22160 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20  s possible from 
22170 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f  the pager..*/.vo
22180 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22190 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61  hrink(Pager *pPa
221a0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
221b0 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67  cacheShrink(pPag
221c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
221d0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65  ./*.** Adjust se
221e0 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  ttings of the pa
221f0 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65  ger to those spe
22200 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67  cified in the pg
22210 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  Flags parameter.
22220 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65  .**.** The "leve
22230 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20  l" in pgFlags & 
22240 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
22250 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20  S_MASK sets the 
22260 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66  robustness.** of
22270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
22280 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
22290 53 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77  S crashes or pow
222a0 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a  er failures by.*
222b0 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  * changing the n
222c0 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
222d0 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  s when writing t
222e0 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  he journals..** 
222f0 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
22300 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
22310 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
22320 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
22330 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
22340 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
22350 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22360 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
22370 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
22380 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
22390 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
223a0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
223b0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
223c0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
223e0 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
223f0 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
22400 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
22410 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
22420 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
22430 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
22440 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
22450 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
22460 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
22470 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
22480 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
22490 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
224a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
224b0 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
224c0 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
224d0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
224e0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
224f0 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
22500 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
22510 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
22520 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
22530 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
22540 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
22550 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
22560 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
22570 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
22580 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
22590 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
225a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
225b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
225c0 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
225d0 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
225e0 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
225f0 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
22600 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
22610 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
22620 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
22630 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
22640 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
22650 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
22660 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
22670 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
22680 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
22690 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
226a0 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
226c0 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
226d0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
226e0 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
226f0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  back..**.** The 
22700 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72  above is for a r
22710 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20  ollback-journal 
22720 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d  mode.  For WAL m
22730 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75  ode, OFF continu
22740 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68  es.** to mean th
22750 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72  at no syncs ever
22760 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20   occur.  NORMAL 
22770 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
22780 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20  AL is synced.** 
22790 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
227a0 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74  rt of checkpoint
227b0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
227c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73  tabase file is s
227d0 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  ynced.** at the 
227e0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68  conclusion of th
227f0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  e checkpoint if 
22800 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
22810 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a  nt of the WAL.**
22820 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63   was written bac
22830 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
22840 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e  ase.  But no syn
22850 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63  c operations occ
22860 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64  ur for.** an ord
22870 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20  inary commit in 
22880 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68  NORMAL mode with
22890 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e   WAL.  FULL mean
228a0 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a  s that the WAL.*
228b0 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  * file is synced
228c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20   following each 
228d0 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e  commit operation
228e0 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f  , in addition to
228f0 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73   the.** syncs as
22900 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f  sociated with NO
22910 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  RMAL..**.** Do n
22920 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68  ot confuse synch
22930 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68  ronous=FULL with
22940 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22950 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  L.  The.** SQLIT
22960 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72  E_SYNC_FULL macr
22970 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74  o means to use t
22980 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20  he MacOSX-style 
22990 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73  full-fsync.** us
229a0 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c  ing fcntl(F_FULL
229b0 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f  FSYNC).  SQLITE_
229c0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e  SYNC_NORMAL mean
229d0 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72  s to do an.** or
229e0 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63  dinary fsync() c
229f0 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e  all.  There is n
22a00 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  o difference bet
22a10 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43  ween SQLITE_SYNC
22a20 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c  _FULL.** and SQL
22a30 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
22a40 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68  on platforms oth
22a50 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20  er than MacOSX. 
22a60 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63   But the.** sync
22a70 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72  hronous=FULL ver
22a80 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  sus synchronous=
22a90 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64  NORMAL setting d
22aa0 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a  etermines when.*
22ab0 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d  * the xSync prim
22ac0 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20  itive is called 
22ad0 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20  and is relevant 
22ae0 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73  to all platforms
22af0 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
22b00 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
22b10 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
22b20 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
22b30 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
22b40 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
22b50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22b60 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
22b70 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22b80 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72  etFlags(.  Pager
22b90 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
22ba0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
22bb0 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65   set safety leve
22bc0 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  l for */.  unsig
22bd0 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
22be0 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67   /* Various flag
22bf0 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  s */.){.  unsign
22c00 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61  ed level = pgFla
22c10 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
22c20 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61  RONOUS_MASK;.  a
22c30 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20  ssert( level>=1 
22c40 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20  && level<=3 );. 
22c50 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
22c60 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
22c70 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
22c80 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
22c90 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
22ca0 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
22cb0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
22cc0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
22cd0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  >noSync ){.    p
22ce0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22cf0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
22d00 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22d10 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
22d20 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22d30 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
22d40 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22d50 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22d60 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67  C_FULL;.    pPag
22d70 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
22d80 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22d90 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  FULL;.  }else if
22da0 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
22db0 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43  R_CKPT_FULLFSYNC
22dc0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22dd0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
22de0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
22df0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22e00 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
22e10 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
22e20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
22e30 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
22e40 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22e50 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
22e60 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
22e70 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22e80 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  L;.  }.  pPager-
22e90 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
22ea0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22eb0 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  s;.  if( pPager-
22ec0 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
22ed0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
22ee0 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e  Flags |= WAL_SYN
22ef0 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a  C_TRANSACTIONS;.
22f00 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67    }.  if( pgFlag
22f10 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53  s & PAGER_CACHES
22f20 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67  PILL ){.    pPag
22f30 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
22f40 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  = ~SPILLFLAG_OFF
22f50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
22f60 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
22f70 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  l |= SPILLFLAG_O
22f80 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  FF;.  }.}.#endif
22f90 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
22fa0 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
22fb0 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
22fc0 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
22fd0 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
22fe0 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
22ff0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
23000 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
23010 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
23020 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
23030 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
23040 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
23050 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
23060 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
23070 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
23080 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
23090 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
230a0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
230b0 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
230c0 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
230d0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
230e0 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
230f0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
23100 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
23110 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
23120 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
23130 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
23140 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
23150 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
23160 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
23170 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
23180 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
23190 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
231a0 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
231b0 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
231c0 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
231d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
231e0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
231f0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
23200 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
23210 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
23220 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
23230 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
23240 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
23250 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
23260 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
23270 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
23280 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
23290 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
232a0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
232b0 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
232c0 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
232d0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
232e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
232f0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
23300 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
23310 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
23320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23330 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
23340 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
23350 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
23360 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
23370 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
23380 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
23390 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
233a0 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
233b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
233c0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
233d0 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
233e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
233f0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
23400 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
23410 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
23420 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
23430 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
23440 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
23450 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
23460 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
23470 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
23480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23490 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
234a0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
234b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
234c0 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
234d0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
234e0 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
234f0 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
23500 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
23510 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
23520 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
23530 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
23540 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
23550 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
23560 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
23570 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
23580 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
23590 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
235a0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
235b0 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
235c0 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
235d0 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
235e0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
235f0 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
23600 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
23610 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
23620 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
23630 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
23640 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
23650 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
23660 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
23670 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
23680 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
23690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
236a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
236b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
236c0 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
236d0 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
236e0 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
236f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
23700 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
23710 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
23720 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
23730 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
23740 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
23750 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
23760 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
23770 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
23780 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
23790 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
237a0 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
237b0 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
237c0 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
237d0 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
237e0 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
237f0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
23800 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
23810 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
23820 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
23830 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
23840 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
23850 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
23880 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
23890 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
238a0 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
238b0 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
238c0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
238d0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
238e0 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
238f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
23900 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
23910 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
23920 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  ){.  pPager->xBu
23930 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
23940 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
23950 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
23960 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
23970 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73  erArg;..  if( is
23980 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23990 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61   ){.    void **a
239a0 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
239b0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
239c0 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
239d0 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
239e0 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
239f0 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61  Handler );.    a
23a00 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42  ssert( ap[1]==pB
23a10 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b  usyHandlerArg );
23a20 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
23a30 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
23a40 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
23a50 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c  _FCNTL_BUSYHANDL
23a60 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b  ER, (void *)ap);
23a70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
23a80 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
23a90 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
23aa0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
23ab0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
23ac0 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
23ad0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
23ae0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
23af0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
23b00 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
23b10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
23b20 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
23b30 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
23b40 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
23b50 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
23b60 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
23b70 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
23b80 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
23b90 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
23ba0 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
23bb0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
23bc0 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
23bd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
23be0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
23bf0 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
23c00 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
23c10 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
23c20 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
23c30 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
23c40 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
23c50 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
23c60 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
23c70 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
23c80 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
23c90 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
23ca0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
23cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
23cc0 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
23cd0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23ce0 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
23cf0 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
23d00 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
23d10 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
23d20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
23d30 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
23d40 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
23d50 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
23d60 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
23d70 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
23d80 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
23d90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
23da0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
23db0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
23dc0 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
23dd0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
23de0 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
23df0 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
23e00 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
23e10 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
23e20 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
23e30 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
23e40 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
23e50 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
23e60 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
23e70 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
23e80 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
23e90 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
23ea0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
23eb0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
23ec0 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
23ed0 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
23ee0 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
23ef0 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
23f00 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
23f10 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
23f20 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
23f30 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
23f40 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
23f50 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
23f60 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
23f70 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
23f80 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
23f90 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
23fa0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
23fb0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
23fc0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
23fd0 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
23fe0 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
23ff0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24000 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
24010 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
24020 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
24030 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
24040 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
24050 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
24060 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
24070 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
24080 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
24090 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
240a0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
240b0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
240c0 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
240d0 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
240e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
240f0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
24100 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24110 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
24120 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
24130 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
24140 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
24150 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
24160 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
24170 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
24180 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
24190 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
241a0 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
241b0 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
241c0 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
241d0 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
241e0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
241f0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
24200 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
24210 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
24220 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
24230 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
24240 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
24250 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
24260 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
24270 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
24280 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
24290 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
242a0 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
242b0 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
242c0 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
242d0 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
242e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
242f0 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
24300 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
24310 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
24320 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
24330 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
24340 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
24350 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24360 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
24370 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
24380 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
24390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
243a0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
243b0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
243c0 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
243d0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
243e0 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
243f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
24400 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24420 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
24430 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
24440 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
24450 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
24460 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
24470 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
24480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24490 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
244a0 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
244b0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
244c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
244d0 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
244e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
244f0 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79  ze = (Pgno)((nBy
24500 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70  te+pageSize-1)/p
24510 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
24520 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24530 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
24540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
24550 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e  lite3PageFree(pN
24560 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ew);.    }.  }..
24570 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
24580 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
24590 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
245a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
245b0 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
245c0 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
245d0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
245e0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
245f0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
24600 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
24610 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
24620 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
24630 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
24640 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67  pPager);.    pag
24650 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
24660 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
24670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24680 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
24690 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
246a0 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
246b0 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
246c0 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
246d0 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
246e0 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
246f0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
24700 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
24710 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
24720 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
24730 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
24740 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
24750 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
24760 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
24770 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
24780 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
24790 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
247a0 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
247b0 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
247c0 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
247d0 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
247e0 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
247f0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
24800 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
24810 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
24820 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24830 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
24840 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
24850 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
24860 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
24870 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
24880 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
24890 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
248a0 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
248b0 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
248c0 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
248d0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
248e0 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
248f0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
24900 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
24910 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
24920 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
24930 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
24940 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
24950 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
24960 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
24970 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
24980 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
24990 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
249a0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
249b0 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
249c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
249d0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
249e0 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
249f0 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
24a00 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
24a10 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
24a20 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
24a30 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
24a40 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
24a50 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
24a60 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
24a70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
24a80 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
24a90 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24aa0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
24ab0 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
24ac0 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
24ad0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
24ae0 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
24af0 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
24b00 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
24b10 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
24b20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
24b30 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
24b40 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
24b50 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
24b60 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
24b70 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
24b80 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
24b90 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
24ba0 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
24bb0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24bc0 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
24bd0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
24be0 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
24bf0 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
24c00 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
24c10 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24c20 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
24c30 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
24c40 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24c50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
24c60 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
24c70 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
24c80 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
24c90 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
24ca0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24cb0 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
24cc0 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
24cd0 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
24ce0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24cf0 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
24d00 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24d10 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
24d20 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
24d30 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
24d40 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
24d50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
24d60 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
24d70 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
24d80 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
24d90 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
24da0 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
24db0 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
24dc0 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
24dd0 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
24de0 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
24df0 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
24e00 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
24e10 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
24e20 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
24e30 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
24e40 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
24e50 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
24e60 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
24e70 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
24e80 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
24e90 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
24ea0 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
24eb0 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
24ec0 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
24ed0 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
24ee0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
24ef0 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
24f00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
24f10 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
24f20 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
24f30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
24f40 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
24f50 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
24f60 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
24f70 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
24f80 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
24f90 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
24fa0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
24fb0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
24fc0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
24fd0 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
24fe0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
24ff0 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
25000 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
25010 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
25020 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
25030 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
25040 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
25050 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
25060 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
25070 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
25080 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
25090 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
250a0 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
250b0 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
250c0 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
250d0 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
250e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
250f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
25100 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
25110 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
25120 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
25130 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
25140 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
25150 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
25160 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
25170 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
25180 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25190 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
251a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
251b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
251c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
251d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
251e0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
251f0 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
25200 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
25210 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
25220 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
25230 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
25240 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
25250 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
25260 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
25270 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
25280 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
25290 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
252a0 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
252b0 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
252c0 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
252d0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
252e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
252f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
25300 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
25310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25320 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
25330 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
25340 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25350 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
25360 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
25370 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
25380 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
25390 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
253a0 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
253b0 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
253c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
253d0 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
253e0 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
253f0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
25400 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
25410 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
25420 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
25430 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
25440 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
25450 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
25460 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
25470 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
25480 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
25490 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
254a0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
254b0 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
254c0 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
254d0 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
254e0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
254f0 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
25500 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
25510 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
25520 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
25530 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
25540 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
25550 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
25560 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
25570 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
25580 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
25590 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
255a0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
255b0 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
255c0 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
255d0 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
255e0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
255f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
25600 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
25610 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
25620 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
25630 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25650 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
25660 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
25670 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
25680 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
25690 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
256a0 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
256b0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20   already held), 
256c0 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72  or one of the tr
256d0 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74  ansitions that t
256e0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
256f0 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
25700 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
25710 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
25720 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
25730 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
25740 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
25750 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
25760 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
25770 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
25780 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
25790 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
257a0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
257b0 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
257c0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
257d0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
257e0 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
257f0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
25800 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
25810 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
25820 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
25830 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
25840 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
25850 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
25860 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
25870 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
25880 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25890 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
258a0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
258b0 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
258c0 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
258d0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
258e0 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
258f0 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
25900 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
25910 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
25920 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
25930 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
25940 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
25950 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
25960 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
25970 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
25980 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
25990 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
259a0 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
259b0 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
259c0 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
259d0 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
259e0 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
259f0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
25a00 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
25a10 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
25a20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
25a30 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
25a40 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
25a50 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
25a60 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
25a70 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
25a80 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
25a90 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
25aa0 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
25ab0 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
25ac0 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
25ad0 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
25ae0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
25af0 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
25b00 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
25b10 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
25b20 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
25b30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
25b40 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
25b50 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
25b60 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
25b70 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
25b80 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
25b90 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65  ehavior would be
25ba0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
25bb0 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
25bc0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
25bd0 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
25be0 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
25bf0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
25c00 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
25c10 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
25c20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
25c30 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
25c40 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
25c50 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
25c60 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
25c70 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
25c80 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
25c90 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
25ca0 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
25cb0 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
25cc0 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
25cd0 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
25ce0 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
25cf0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
25d00 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
25d10 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
25d20 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25d30 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
25d40 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
25d50 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
25d60 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
25d70 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
25d80 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
25d90 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
25da0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
25db0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
25dc0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25dd0 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
25de0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
25df0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
25e00 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
25e10 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
25e20 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
25e30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
25e40 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
25e50 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
25e60 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
25e70 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
25e80 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
25e90 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
25ea0 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
25eb0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
25ec0 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
25ed0 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
25ee0 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
25ef0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
25f00 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
25f10 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
25f20 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
25f30 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
25f40 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
25f50 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
25f60 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
25f70 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
25f80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25f90 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
25fa0 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
25fb0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
25fc0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20  action..** Once 
25fd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
25fe0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  s been called, t
25ff0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
26000 75 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a  ust either be.**
26010 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20   rolled back or 
26020 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73  committed. It is
26030 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c   not safe to cal
26040 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
26050 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74  and.** then cont
26060 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20  inue writing to 
26070 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
26080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
26090 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
260a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
260b0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
260c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
260d0 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
260e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
260f0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
26100 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
26110 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
26120 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f  ze = nPage;..  /
26130 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
26140 68 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c  he code here cal
26150 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  led assertTrunca
26160 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74  teConstraint() t
26170 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68  o.  ** ensure th
26180 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69  at all pages bei
26190 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61  ng truncated awa
261a0 79 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  y by this operat
261b0 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66  ion are,.  ** if
261c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
261d0 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e  epoints are open
261e0 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  , present in the
261f0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
26200 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74   journal so that
26210 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73   they can be res
26220 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76  tored if the sav
26230 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64  epoint is rolled
26240 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73  .  ** back. This
26250 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65   is no longer ne
26260 63 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20  cessary as this 
26270 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
26280 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64  only.  ** called
26290 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
262a0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
262b0 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f  action. So altho
262c0 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ugh the .  ** Pa
262d0 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73  ger object may s
262e0 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73  till have open s
262f0 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72  avepoints (Pager
26300 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c  .nSavepoint!=0),
26310 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e   .  ** they cann
26320 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
26330 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74  k. So the assert
26340 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26350 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69  nt() call.  ** i
26360 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72  s no longer corr
26370 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a  ect. */.}.../*.*
26380 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26390 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
263a0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f   attempting a ho
263b0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
263c0 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20  ck. It.** syncs 
263d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
263e0 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73   to disk, then s
263f0 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ets pPager->jour
26400 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a  nalHdr to the.**
26410 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
26420 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61  rnal file so tha
26430 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  t the pager_play
26440 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b  back() routine k
26450 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  nows.** that the
26460 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
26470 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
26480 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63  nced..**.** Sync
26490 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
264a0 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65  l to disk before
264b0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
264c0 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75  oll it back ensu
264d0 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20  res .** that if 
264e0 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  a power-failure 
264f0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
26500 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  e rollback, the 
26510 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20  process that.** 
26520 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63  attempts rollbac
26530 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74  k following syst
26540 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73  em recovery sees
26550 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61   the same journa
26560 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20  l.** content as 
26570 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  this process..**
26580 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
26590 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65  g goes as planne
265a0 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
265b0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
265c0 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69  ise, .** an SQLi
265d0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
265e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
265f0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
26600 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26610 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26620 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
26630 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
26640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26650 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
26660 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
26670 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69  NORMAL);.  }.  i
26680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26690 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
266a0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
266b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
266c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
266d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
266e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  c;.}../*.** Obta
266f0 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
26700 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  o a memory mappe
26710 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f  d page object fo
26720 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  r page number pg
26730 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20  no. .** The new 
26740 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20  object will use 
26750 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74  the pointer pDat
26760 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  a, obtained from
26770 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66   xFetch()..** If
26780 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
26790 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e   *ppPage to poin
267a0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
267b0 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61  e reference.** a
267c0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
267d0 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
267e0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
267f0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
26800 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74  set.** *ppPage t
26810 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61  o zero..**.** Pa
26820 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62  ge references ob
26830 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
26840 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
26850 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73  should be releas
26860 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67  ed.** by calling
26870 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
26880 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
26890 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
268a0 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67  reMapPage(.  Pag
268b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
268c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
268d0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
268e0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26900 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
26910 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74   */.  void *pDat
26920 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
26930 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28        /* xFetch(
26940 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69  )'d data for thi
26950 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
26960 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20  r **ppPage      
26970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26980 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67  UT: Acquired pag
26990 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
269a0 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
269b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269c0 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
269d0 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e  d page to return
269e0 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61   */.  .  if( pPa
269f0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26a00 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  st ){.    *ppPag
26a10 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  e = p = pPager->
26a20 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
26a30 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70     pPager->pMmap
26a40 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44  Freelist = p->pD
26a50 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
26a60 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  rty = 0;.    mem
26a70 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30  set(p->pExtra, 0
26a80 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
26a90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26aa0 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50  *ppPage = p = (P
26ab0 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  gHdr *)sqlite3Ma
26ac0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
26ad0 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d  PgHdr) + pPager-
26ae0 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66  >nExtra);.    if
26af0 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p==0 ){.      
26b00 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
26b10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
26b20 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
26b30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26b40 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  Data);.      ret
26b50 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
26b70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29  Extra = (void *)
26b80 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c  &p[1];.    p->fl
26b90 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50  ags = PGHDR_MMAP
26ba0 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
26bb0 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72  1;.    p->pPager
26bc0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a   = pPager;.  }..
26bd0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78    assert( p->pEx
26be0 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b  tra==(void *)&p[
26bf0 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1] );.  assert( 
26c00 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  p->pPage==0 );. 
26c10 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67   assert( p->flag
26c20 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b  s==PGHDR_MMAP );
26c30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26c40 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
26c50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
26c60 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67  f==1 );..  p->pg
26c70 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e  no = pgno;.  p->
26c80 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20  pData = pData;. 
26c90 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
26ca0 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  t++;..  return S
26cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26cc0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
26cd0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70  erence to page p
26ce0 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76  Pg. pPg must hav
26cf0 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  e been returned 
26d00 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65  by an .** earlie
26d10 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41  r call to pagerA
26d20 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e  cquireMapPage().
26d30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26d40 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
26d50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
26d60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26d70 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
26d80 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
26d90 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69  ut--;.  pPg->pDi
26da0 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  rty = pPager->pM
26db0 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70  mapFreelist;.  p
26dc0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26dd0 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61  list = pPg;..  a
26de0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
26df0 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
26e00 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71  rsion>=3 );.  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 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50  (pPg->pgno-1)*pP
26e40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
26e50 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a  pPg->pData);.}..
26e60 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50  /*.** Free all P
26e70 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f  gHdr objects sto
26e80 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
26e90 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c  .pMmapFreelist l
26ea0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
26eb0 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70  oid pagerFreeMap
26ec0 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67  Hdrs(Pager *pPag
26ed0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  er){.  PgHdr *p;
26ee0 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b  .  PgHdr *pNext;
26ef0 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
26f00 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20  >pMmapFreelist; 
26f10 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
26f20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72   pNext = p->pDir
26f30 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ty;.    sqlite3_
26f40 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
26f50 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
26f60 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
26f70 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
26f80 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
26f90 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
26fa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
26fb0 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
26fc0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
26fd0 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
26fe0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
26ff0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
27000 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
27010 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
27020 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
27030 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
27040 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
27050 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
27060 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
27070 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
27080 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
27090 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
270a0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
270b0 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
270c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
270d0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
270e0 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
270f0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
27100 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
27110 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
27120 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
27130 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
27140 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
27150 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
27160 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
27170 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
27180 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
27190 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
271a0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
271b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
271c0 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
271d0 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  r){.  u8 *pTmp =
271e0 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
271f0 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73  TmpSpace;..  ass
27200 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
27210 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
27220 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  );.  disable_sim
27230 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
27240 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
27250 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
27260 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70  ;.  pagerFreeMap
27270 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20  Hdrs(pPager);.  
27280 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  /* pPager->errCo
27290 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  de = 0; */.  pPa
272a0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
272b0 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  de = 0;.#ifndef 
272c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
272d0 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
272e0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
272f0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
27300 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70  Flags, pPager->p
27310 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a  ageSize, pTmp);.
27320 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d    pPager->pWal =
27330 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67   0;.#endif.  pag
27340 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
27350 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
27360 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
27370 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
27380 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
27390 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74   is open, sync t
273a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
273b0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55  before calling U
273c0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
273d0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
273e0 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68   is not done, th
273f0 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70  en an unsynced p
27400 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ortion of the op
27410 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  en journal .    
27420 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70  ** file may be p
27430 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
27440 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
27450 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
27460 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20   occurs .    ** 
27470 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61  while this is ha
27480 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
27490 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f  abase could beco
274a0 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
274b0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20  **.    ** If an 
274c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
274d0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e  le trying to syn
274e0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  c the journal, s
274f0 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20  hift the pager. 
27500 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45     ** into the E
27510 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73  RROR state. This
27520 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e   causes UnlockAn
27530 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c  dRollback to unl
27540 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ock the.    ** d
27550 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73  atabase and clos
27560 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
27570 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  le without attem
27580 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
27590 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20  .    ** back or 
275a0 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65  finalize it. The
275b0 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75   next database u
275c0 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  ser will have to
275d0 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a   do hot-journal.
275e0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
275f0 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67  before accessing
27600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27610 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
27620 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
27630 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
27640 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
27650 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
27660 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
27670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
27680 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
27690 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
276a0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
276b0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
276c0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
276d0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
276e0 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
276f0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
27700 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
27710 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
27720 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
27730 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
27740 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
27750 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
27760 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
27770 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
27780 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
27790 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
277a0 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
277b0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
277c0 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
277d0 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
277e0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
277f0 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
27800 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
27810 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
27820 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
27830 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
27840 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
27850 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27860 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
27870 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
27880 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
27890 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
278a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
278b0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
278c0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
278d0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
278e0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
278f0 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
27900 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
27910 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
27920 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
27930 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
27940 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
27950 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
27960 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
27970 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
27980 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27990 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
279a0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
279b0 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
279c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
279d0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
279e0 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
279f0 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
27a00 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
27a10 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
27a20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
27a30 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
27a40 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
27a50 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
27a60 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
27a70 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
27a80 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
27a90 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
27aa0 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
27ab0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
27ac0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
27ad0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
27ae0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
27af0 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
27b00 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
27b10 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
27b20 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
27b30 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
27b40 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
27b50 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
27b60 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
27b70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27b80 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
27b90 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
27ba0 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
27bb0 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
27bc0 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
27bd0 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
27be0 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
27bf0 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
27c00 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
27c10 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
27c20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
27c30 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
27c40 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
27c50 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
27c60 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
27c70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
27c80 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
27c90 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
27ca0 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
27cb0 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
27cc0 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
27cd0 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
27ce0 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
27cf0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
27d00 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
27d10 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
27d20 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
27d30 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
27d40 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
27d50 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
27d60 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
27d70 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
27d80 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
27d90 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
27da0 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
27db0 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
27dc0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
27dd0 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
27de0 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
27df0 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
27e00 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
27e10 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
27e20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
27e30 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
27e40 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
27e50 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
27e60 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
27e70 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
27e80 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49  ;.**   }.**.** I
27e90 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
27ea0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
27eb0 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
27ec0 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
27ed0 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
27ee0 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
27ef0 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
27f00 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
27f10 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
27f20 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
27f30 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
27f40 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
27f50 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
27f60 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
27f70 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
27f80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
27f90 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e  nt newHdr){.  in
27fa0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27fc0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
27fd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27fe0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
27ff0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
28000 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
28010 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
28020 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
28030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
28040 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
28050 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
28060 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
28070 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
28080 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28090 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
280a0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
280b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
280c0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
280d0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
280e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
280f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
28100 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
28110 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28120 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
28130 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
28140 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
28150 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
28160 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
28170 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
28180 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
28190 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
281a0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
281b0 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
281c0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
281d0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
281e0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
281f0 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
28200 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
28210 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
28220 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
28230 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
28240 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
28250 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
28260 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
28270 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
28280 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
28290 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
282a0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
282b0 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
282c0 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
282d0 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
282e0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
282f0 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
28300 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
28310 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
28320 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
28330 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
28340 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
28350 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
28360 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
28370 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
28380 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
28390 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
283a0 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
283b0 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
283c0 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
283d0 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
283e0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
283f0 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
28400 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
28410 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28420 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
28430 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
28440 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
28450 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
28460 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
28470 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
28480 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
28490 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
284a0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
284b0 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
284c0 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
284d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
284e0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
284f0 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
28500 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
28510 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
28520 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
28530 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
28540 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
28550 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
28560 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28570 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
28580 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
28590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
285a0 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
285b0 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
285c0 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
285d0 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
285e0 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
285f0 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
28600 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
28610 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
28620 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
28630 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
28640 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
28650 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
28660 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
28670 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
28680 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
28690 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
286a0 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
286b0 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
286c0 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
286d0 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
286e0 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
286f0 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
28700 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
28710 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
28720 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
28730 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
28740 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
28750 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28760 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
28770 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
28780 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
28790 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
287a0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
287b0 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
287c0 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
287d0 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
287e0 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
287f0 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
28800 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
28810 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
28820 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
28830 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
28840 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
28850 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
28860 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
28870 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28880 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
28890 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
288a0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
288b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
288c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
288d0 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
288e0 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
288f0 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
28900 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
28910 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
28920 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28930 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
28940 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
28950 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
28960 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
28970 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
28980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
28990 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
289a0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
289b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
289c0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
289d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
289e0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
289f0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
28a00 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
28a10 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
28a20 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
28a30 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
28a40 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
28a50 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
28a60 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
28a70 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
28a80 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
28a90 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
28aa0 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
28ab0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
28ac0 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
28ad0 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
28ae0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
28af0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
28b00 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
28b10 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
28b20 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28b30 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
28b40 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
28b50 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
28b60 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
28b70 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
28b80 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
28b90 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
28ba0 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
28bb0 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
28bc0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
28bd0 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
28be0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
28bf0 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
28c00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
28c10 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
28c20 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
28c30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28c40 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
28c50 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
28c60 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
28c70 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
28c80 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28c90 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
28ca0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28cb0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
28cc0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28cd0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
28ce0 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
28cf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
28d00 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
28d10 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28d20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28d30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28d40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28d50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
28d60 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
28d70 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
28d80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28d90 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
28da0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28db0 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
28dc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
28dd0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
28de0 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
28df0 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
28e00 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
28e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28e30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
28e40 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
28e50 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
28e60 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
28e70 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
28e80 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
28e90 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
28ea0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28eb0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
28ec0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
28ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
28ee0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
28ef0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
28f00 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
28f10 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
28f20 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
28f30 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
28f40 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
28f50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
28f60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28f70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28f80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61      }..      pPa
28f90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
28fa0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
28fb0 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  lOff;.      if( 
28fc0 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44  newHdr && 0==(iD
28fd0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
28fe0 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
28ff0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
29000 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
29010 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
29020 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
29030 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29040 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29050 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
29060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
29070 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
29080 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
29090 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
290a0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74  }..  /* Unless t
290b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
290c0 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  oSync mode, the 
290d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
290e0 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63   just .  ** succ
290f0 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
29100 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65   Either way, cle
29110 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
29120 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a  D_SYNC flag on .
29130 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a    ** all pages..
29140 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
29150 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
29160 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
29170 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  he);.  pPager->e
29180 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
29190 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73  ITER_DBMOD;.  as
291a0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
291b0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
291c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
291d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
291e0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
291f0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
29200 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
29210 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
29220 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
29230 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
29240 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
29250 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
29260 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
29270 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
29280 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
29290 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
292a0 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
292b0 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
292c0 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
292d0 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
292e0 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
292f0 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
29300 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
29310 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
29320 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
29330 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
29340 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
29350 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
29360 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
29370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29380 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
29390 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
293a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
293b0 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
293c0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
293d0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
293e0 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
293f0 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
29400 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
29410 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
29420 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
29430 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
29440 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
29450 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
29460 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
29470 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
29480 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
29490 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
294a0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
294b0 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
294c0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
294d0 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
294e0 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
294f0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
29500 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
29510 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
29520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29530 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
29540 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
29550 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
29560 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
29570 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
29580 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
29590 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
295a0 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
295b0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
295c0 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
295d0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
295e0 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
295f0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
29600 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
29610 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
29620 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29630 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
29640 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
29650 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
29660 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
29670 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
29680 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
29690 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
296a0 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
296b0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
296c0 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
296d0 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
296e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
296f0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
29700 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
29710 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
29720 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
29730 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
29740 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
29750 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29760 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
29770 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
29780 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
29790 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
297a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
297b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
297c0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
297d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
297e0 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
297f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29800 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
29810 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29820 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
29830 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
29840 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f  ly called for ro
29850 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e  llback pagers in
29860 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74   WRITER_DBMOD st
29870 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ate. */.  assert
29880 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
29890 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
298a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
298b0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
298c0 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
298d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
298e0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
298f0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
29900 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
29910 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
29920 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
29930 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
29940 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
29950 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
29960 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
29970 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
29980 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
29990 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
299a0 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
299b0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
299c0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
299d0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
299e0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
299f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
29a00 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
29a10 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
29a20 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
29a30 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
29a40 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
29a50 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
29a60 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
29a70 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
29a80 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
29a90 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
29aa0 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
29ab0 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61  ill be..  */.  a
29ac0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
29ad0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
29ae0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
29af0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29b00 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  K .   && pPager-
29b10 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67  >dbHintSize<pPag
29b20 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26  er->dbSize.   &&
29b30 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20   (pList->pDirty 
29b40 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70  || pList->pgno>p
29b50 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29b60 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  e).  ){.    sqli
29b70 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
29b80 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
29b90 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
29ba0 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
29bb0 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
29bc0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
29bd0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
29be0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
29bf0 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
29c00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
29c10 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
29c20 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
29c30 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
29c40 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
29c50 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
29c60 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
29c70 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
29c80 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
29c90 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
29ca0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
29cb0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
29cc0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
29cd0 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
29ce0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
29cf0 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
29d00 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
29d10 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
29d20 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
29d30 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
29d40 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
29d50 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
29d60 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
29d70 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
29d80 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
29d90 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
29da0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
29db0 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
29dc0 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
29dd0 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
29de0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
29df0 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
29e00 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
29e10 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
29e20 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
29e30 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
29e40 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
29e50 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
29e60 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
29e70 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
29e80 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
29e90 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
29ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
29ed0 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
29ee0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
29ef0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
29f00 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
29f10 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
29f20 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
29f30 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
29f40 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
29f50 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
29f60 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
29f70 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
29f80 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
29f90 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
29fa0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
29fb0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
29fc0 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
29fd0 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
29fe0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29ff0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
2a000 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
2a010 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
2a020 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
2a030 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
2a040 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
2a050 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
2a060 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
2a070 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
2a080 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
2a090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2a0a0 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
2a0b0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
2a0c0 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
2a0d0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
2a0e0 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
2a0f0 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
2a100 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
2a110 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
2a120 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
2a130 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
2a140 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
2a150 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
2a160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a170 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
2a180 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
2a190 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
2a1a0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
2a1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
2a1c0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
2a1d0 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b  R_STAT_WRITE]++;
2a1e0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
2a1f0 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
2a200 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
2a210 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
2a220 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
2a230 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
2a240 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
2a250 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
2a260 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b  *)pList->pData);
2a270 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ..      PAGERTRA
2a280 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE(("STORE %d pa
2a290 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
2a2a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2a2b0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
2a2c0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
2a2d0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
2a2e0 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ist)));.      IO
2a2f0 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
2a300 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2a310 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
2a320 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
2a330 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2a340 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ount);.    }else
2a350 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
2a360 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
2a370 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2a380 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
2a390 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o));.    }.    p
2a3a0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
2a3b0 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  h(pList);.    pL
2a3c0 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
2a3d0 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
2a3e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a3f0 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
2a400 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
2a410 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
2a420 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
2a430 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
2a440 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
2a450 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2a460 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
2a470 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
2a480 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
2a490 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
2a4a0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
2a4b0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2a4c0 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
2a4d0 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
2a4e0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2a4f0 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
2a500 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
2a510 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2a520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
2a530 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2a540 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
2a550 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2a560 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2a570 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
2a580 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
2a590 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2a5a0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
2a5b0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
2a5c0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
2a5d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2a5e0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
2a5f0 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
2a600 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
2a610 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
2a620 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a630 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
2a640 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
2a650 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
2a660 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
2a670 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
2a680 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2a690 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
2a6a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2a6b0 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
2a6c0 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
2a6d0 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
2a6e0 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
2a6f0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
2a700 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2a710 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
2a720 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2a730 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
2a740 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
2a750 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
2a760 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
2a770 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
2a780 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
2a790 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
2a7a0 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
2a7b0 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
2a7c0 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
2a7d0 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
2a7e0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2a7f0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2a800 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a810 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
2a820 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2a830 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
2a840 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2a850 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2a860 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
2a870 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2a880 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
2a890 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
2a8a0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
2a8b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2a8c0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2a8d0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2a8e0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2a8f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2a900 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
2a910 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2a920 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
2a930 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
2a940 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
2a950 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a960 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
2a970 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  eInJournal(pPage
2a980 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20  r, pPg) .       
2a990 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
2a9a0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2a9b0 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
2a9c0 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2a9d0 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
2a9e0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
2a9f0 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
2aa00 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
2aa10 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
2aa20 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
2aa30 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
2aa40 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
2aa50 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2aa60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2aa70 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
2aa80 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2aa90 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2aaa0 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d  t = (i64)pPager-
2aab0 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
2aac0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
2aad0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2aae0 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45  2;.  .      CODE
2aaf0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
2ab00 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
2ab10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ab20 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
2ab30 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2ab40 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
2ab50 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2ab60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2ab70 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
2ab80 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
2ab90 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  s(pPager->sjfd, 
2aba0 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
2abb0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2abc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2abd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2abe0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2abf0 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c  r->sjfd, pData2,
2ac00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2ac10 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
2ac20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ac30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ac40 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
2ac50 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20  r->nSubRec++;.  
2ac60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ac70 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
2ac80 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f  ;.    rc = addTo
2ac90 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
2aca0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
2acb0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
2acc0 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69  n rc;.}.static i
2acd0 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
2ace0 65 49 66 52 65 71 75 69 72 65 64 28 50 67 48 64  eIfRequired(PgHd
2acf0 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 73  r *pPg){.  if( s
2ad00 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
2ad10 70 50 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  pPg) ){.    retu
2ad20 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  rn subjournalPag
2ad30 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
2ad40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ad50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
2ad60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2ad70 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
2ad80 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20  he pcache layer 
2ad90 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63  when it has reac
2ada0 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74  hed some.** soft
2adb0 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54   memory limit. T
2adc0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
2add0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
2ade0 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74  o a Pager object
2adf0 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76  .** (cast as a v
2ae00 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72  oid*). The pager
2ae10 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67   is always 'purg
2ae20 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69  eable' (not an i
2ae30 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61  n-memory.** data
2ae40 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e  base). The secon
2ae50 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
2ae60 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70  reference to a p
2ae70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20  age that is .** 
2ae80 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
2ae90 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  but has no outst
2aea0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
2aeb0 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69  s. The page.** i
2aec0 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61  s always associa
2aed0 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67  ted with the Pag
2aee0 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
2aef0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a   as the first .*
2af00 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
2af10 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
2af20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f  s function is to
2af30 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20   make pPg clean 
2af40 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63  by writing its c
2af50 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74  ontents.** out t
2af60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2af70 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ile, if possible
2af80 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c  . This may invol
2af90 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a  ve syncing the.*
2afa0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
2afb0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2afc0 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61  sful, sqlite3Pca
2afd0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2afe0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
2aff0 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  page and.** SQLI
2b000 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2b010 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2b020 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2b030 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ng to make the.*
2b040 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68  * page clean, th
2b050 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
2b060 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2b070 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  the page cannot 
2b080 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e  be.** made clean
2b090 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
2b0a0 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65  reason, but no e
2b0b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
2b0c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
2b0d0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  s returned by sq
2b0e0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2b0f0 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61  lean() is not ca
2b100 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
2b110 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28  int pagerStress(
2b120 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a  void *p, PgHdr *
2b130 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
2b140 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
2b150 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  )p;.  int rc = S
2b160 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2b170 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
2b180 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
2b190 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
2b1a0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
2b1b0 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  /* The doNotS
2b1c0 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20  pill NOSYNC bit 
2b1d0 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69  is set during ti
2b1e0 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61  mes when doing a
2b1f0 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f   sync of.  ** jo
2b200 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e  urnal (and addin
2b210 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20  g a new header) 
2b220 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20  is not allowed. 
2b230 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a   This occurs.  *
2b240 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74  * during calls t
2b250 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
2b260 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69  ite() while tryi
2b270 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75  ng to journal mu
2b280 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65  ltiple.  ** page
2b290 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
2b2a0 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a  he same sector..
2b2b0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f    **.  ** The do
2b2c0 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43  NotSpill ROLLBAC
2b2d0 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69  K and OFF bits i
2b2e0 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68  nhibits all cach
2b2f0 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20  e spilling.  ** 
2b300 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2b310 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73  ether or not a s
2b320 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
2b330 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75    This is set du
2b340 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c  ring.  ** a roll
2b350 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20  back or by user 
2b360 72 65 71 75 65 73 74 2c 20 72 65 73 70 65 63 74  request, respect
2b370 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ively..  **.  **
2b380 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73   Spilling is als
2b390 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65  o prohibited whe
2b3a0 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  n in an error st
2b3b0 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63  ate since that c
2b3c0 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74  ould.  ** lead t
2b3d0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
2b3e0 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20  ption.   In the 
2b3f0 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
2b400 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20  tation it .  ** 
2b410 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
2b420 72 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  r sqlite3PcacheF
2b430 65 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c  etch() to be cal
2b440 6c 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46  led with createF
2b450 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c  lag==3.  ** whil
2b460 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  e in the error s
2b470 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69  tate, hence it i
2b480 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
2b490 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
2b4a0 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
2b4b0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2b4c0 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  te.  Nevertheles
2b4d0 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20  s, we include a 
2b4e0 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73  NEVER().  ** tes
2b4f0 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20  t for the error 
2b500 73 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67  state as a safeg
2b510 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74  uard against fut
2b520 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a  ure changes..  *
2b530 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2b540 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2b550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b560 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  K;.  testcase( p
2b570 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b580 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
2b590 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65 73 74  LLBACK );.  test
2b5a0 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2b5b0 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2b5c0 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65  FLAG_OFF );.  te
2b5d0 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2b5e0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2b5f0 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b  LLFLAG_NOSYNC );
2b600 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2b610 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26 20  oNotSpill.   && 
2b620 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ((pPager->doNotS
2b630 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41  pill & (SPILLFLA
2b640 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c  G_ROLLBACK|SPILL
2b650 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20  FLAG_OFF))!=0.  
2b660 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61      || (pPg->fla
2b670 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
2b680 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20  SYNC)!=0).  ){. 
2b690 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b6a0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d  _OK;.  }..  pPg-
2b6b0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69  >pDirty = 0;.  i
2b6c0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
2b6d0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
2b6e0 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   Write a single 
2b6f0 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70  frame for this p
2b700 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20  age to the log. 
2b710 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a  */.    rc = subj
2b720 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
2b730 69 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20  ired(pPg); .    
2b740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b750 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2b760 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
2b770 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30  Pager, pPg, 0, 0
2b780 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2b790 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63  {.  .    /* Sync
2b7a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b7b0 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
2b7c0 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66  /.    if( pPg->f
2b7d0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2b7e0 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50  SYNC .     || pP
2b7f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2b800 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
2b810 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  MOD.    ){.     
2b820 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
2b830 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  l(pPager, 1);.  
2b840 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
2b850 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2b860 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
2b870 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b880 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2b890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b8a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2b8b0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
2b8c0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2b8d0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
2b8e0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2b8f0 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29  ist(pPager, pPg)
2b900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2b910 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
2b920 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
2b930 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b940 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
2b950 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
2b960 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2b970 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2b980 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
2b990 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2b9a0 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
2b9b0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2b9c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2b9d0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68   .}../*.** Flush
2b9e0 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65   all unreference
2b9f0 64 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  d dirty pages to
2ba00 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
2ba10 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
2ba20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ba30 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
2ba40 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
2ba50 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
2ba60 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73  PgHdr *pList = s
2ba70 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2ba80 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2ba90 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65  Cache);.    asse
2baa0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2bab0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2bac0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
2bad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2bae0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48  ist ){.      PgH
2baf0 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
2bb00 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  t->pDirty;.     
2bb10 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66   if( pList->nRef
2bb20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2bb30 63 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28  c = pagerStress(
2bb40 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70  (void*)pPager, p
2bb50 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
2bb60 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65       pList = pNe
2bb70 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
2bb80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2bb90 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
2bba0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
2bbb0 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
2bbc0 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
2bbd0 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
2bbe0 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
2bbf0 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
2bc00 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
2bc10 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
2bc20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
2bc30 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
2bc40 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
2bc50 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path 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 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
2bc80 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2bc90 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
2bca0 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
2bcb0 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
2bcc0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
2bcd0 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
2bce0 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
2bcf0 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
2bd00 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
2bd10 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
2bd20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
2bd30 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2bd40 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
2bd50 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
2bd60 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
2bd70 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
2bd80 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
2bd90 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
2bda0 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
2bdb0 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
2bdc0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
2bdd0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
2bde0 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
2bdf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2be00 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2be10 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
2be20 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
2be30 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
2be40 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
2be50 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
2be60 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
2be70 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
2be80 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ) API..**.** The
2be90 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
2bea0 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
2beb0 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68  fy properties th
2bec0 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a  at affect the.**
2bed0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
2bee0 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75  e pager. It shou
2bef0 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d  ld be passed som
2bf00 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e  e bitwise combin
2bf10 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ation.** of the 
2bf20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a  PAGER_* flags..*
2bf30 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
2bf40 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
2bf50 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
2bf60 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
2bf70 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
2bf80 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
2bf90 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
2bfa0 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
2bfb0 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
2bfc0 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
2bfd0 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
2bfe0 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
2bff0 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
2c000 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
2c010 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2c020 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
2c030 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
2c040 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
2c050 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
2c060 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2c070 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
2c080 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
2c090 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
2c0a0 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
2c0b0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
2c0c0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
2c0d0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
2c0e0 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
2c0f0 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
2c100 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
2c110 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
2c120 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
2c130 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2c140 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
2c150 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2c160 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
2c170 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
2c180 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
2c190 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
2c1a0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
2c1b0 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
2c1c0 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
2c1d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2c1e0 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
2c1f0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2c200 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
2c210 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
2c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c230 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
2c240 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
2c250 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
2c260 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2c270 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2c280 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
2c290 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
2c2a0 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
2c2b0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
2c2c0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
2c2d0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
2c2e0 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
2c2f0 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
2c300 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
2c310 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
2c320 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
2c330 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
2c340 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
2c350 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2c360 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
2c370 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
2c380 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c390 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
2c3a0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
2c3b0 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
2c3c0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2c3d0 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
2c3e0 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
2c3f0 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
2c400 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
2c410 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c420 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2c430 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
2c440 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
2c450 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2c460 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
2c470 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
2c480 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c490 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
2c4a0 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
2c4b0 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
2c4c0 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
2c4d0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
2c4e0 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
2c4f0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2c500 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
2c510 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
2c520 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
2c530 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
2c540 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
2c550 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
2c560 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
2c570 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
2c580 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
2c590 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73  t pcacheSize = s
2c5a0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2c5b0 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74  ();       /* Byt
2c5c0 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
2c5d0 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75  or PCache */.  u
2c5e0 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20  32 szPageDflt = 
2c5f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2c600 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65  AGE_SIZE;  /* De
2c610 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2c620 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2c630 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a  *zUri = 0;    /*
2c640 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70   URI args to cop
2c650 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20  y */.  int nUri 
2c660 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2c670 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2c680 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61  es of URI args a
2c690 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a  t *zUri */..  /*
2c6a0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
2c6b0 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
2c6c0 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
2c6d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2c6e0 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
2c6f0 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
2c700 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
2c710 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
2c720 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
2c730 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
2c740 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
2c750 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2c760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2c770 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
2c780 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
2c790 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
2c7a0 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
2c7b0 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
2c7c0 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
2c7d0 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
2c7e0 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
2c7f0 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
2c800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
2c810 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
2c820 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2c830 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2c840 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
2c850 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
2c860 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
2c870 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
2c880 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2c890 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
2c8a0 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
2c8b0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2c8c0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2c8d0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2c8e0 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
2c8f0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2c900 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2c910 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
2c920 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
2c930 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
2c940 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
2c950 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
2c960 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
2c970 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66  pPager = 0;..#if
2c980 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c990 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
2c9a0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45  flags & PAGER_ME
2c9b0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44  MORY ){.    memD
2c9c0 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a  b = 1;.    if( z
2c9d0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2c9e0 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2c9f0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2ca00 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2ca10 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2ca20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2ca30 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51  ==0  ) return SQ
2ca40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2ca50 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2ca60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2ca70 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2ca80 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2ca90 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2caa0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
2cab0 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
2cac0 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
2cad0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
2cae0 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
2caf0 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
2cb00 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
2cb10 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
2cb20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2cb30 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
2cb40 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
2cb50 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
2cb60 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
2cb70 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2cb80 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2cb90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2cba0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
2cbb0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2cbc0 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
2cbd0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2cbe0 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61  ocRaw(0, nPathna
2cbf0 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
2cc00 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
2cc10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2cc20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2cc30 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
2cc40 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
2cc50 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
2cc60 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
2cc70 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
2cc80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2cc90 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
2cca0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
2ccb0 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
2ccc0 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e  ame);.    nPathn
2ccd0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2cce0 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2ccf0 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d  ;.    z = zUri =
2cd00 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69   &zFilename[sqli
2cd10 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
2cd20 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77  ename)+1];.    w
2cd30 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
2cd40 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2cd50 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2cd60 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2cd70 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2cd80 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28    }.    nUri = (
2cd90 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72  int)(&z[1] - zUr
2cda0 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i);.    assert( 
2cdb0 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nUri>=0 );.    i
2cdc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cdd0 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
2cde0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2cdf0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
2ce00 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
2ce10 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
2ce20 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
2ce30 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
2ce40 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
2ce50 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
2ce60 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
2ce70 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
2ce80 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
2ce90 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
2cea0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
2ceb0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
2cec0 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
2ced0 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
2cee0 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
2cef0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
2cf00 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
2cf10 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
2cf20 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
2cf30 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
2cf40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2cf50 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
2cf60 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2cf70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cf80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2cf90 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2cfa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2cfb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2cfc0 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
2cfd0 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
2cfe0 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
2cff0 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
2d000 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
2d010 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
2d020 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2d030 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
2d040 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
2d050 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
2d060 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
2d070 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
2d080 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
2d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0a0 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
2d0b0 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
2d0c0 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0e0 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
2d0f0 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
2d100 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2d110 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2d120 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
2d130 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
2d140 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
2d150 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2d160 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2d170 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2d180 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
2d190 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2d1a0 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
2d1b0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2d1c0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2d1d0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
2d1e0 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2d1f0 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
2d200 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
2d210 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
2d220 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2d230 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
2d240 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
2d250 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2d260 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
2d270 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
2d280 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
2d290 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
2d2a0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
2d2b0 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
2d2c0 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
2d2d0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2d2e0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
2d2f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2d300 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
2d310 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2d320 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
2d330 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
2d340 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
2d350 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
2d360 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20  + nUri +        
2d370 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
2d380 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2d390 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   8 + 2          
2d3a0 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
2d3b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2d3c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b  E_OMIT_WAL.    +
2d3d0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b   nPathname + 4 +
2d3e0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   2            /*
2d3f0 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a   zWal */.#endif.
2d400 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45    );.  assert( E
2d410 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2d420 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ENT(SQLITE_INT_T
2d430 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c  O_PTR(journalFil
2d440 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28  eSize)) );.  if(
2d450 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71   !pPtr ){.    sq
2d460 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2d470 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
2d480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d490 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
2d4a0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
2d4b0 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
2d4c0 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
2d4d0 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
2d4e0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d4f0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2d500 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
2d510 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
2d520 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d530 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
2d540 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
2d550 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
2d560 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d570 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2d580 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
2d590 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
2d5a0 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
2d5b0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2d5c0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d5d0 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
2d5e0 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2d5f0 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
2d600 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2d610 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
2d620 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
2d630 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
2d640 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
2d650 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
2d660 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
2d670 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
2d680 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  hname ){.    ass
2d690 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30  ert( nPathname>0
2d6a0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2d6b0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
2d6c0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
2d6d0 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2d6e0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2d6f0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d700 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2d710 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
2d720 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26   nUri ) memcpy(&
2d730 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d740 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20  e[nPathname+1], 
2d750 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
2d760 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d770 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
2d780 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2d790 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2d7a0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2d7b0 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
2d7c0 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a  nal\000", 8+2);.
2d7d0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2d7e0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2d7f0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d800 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66  ->zJournal);.#if
2d810 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d820 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d  _WAL.    pPager-
2d830 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  >zWal = &pPager-
2d840 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2d850 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65  ame+8+1];.    me
2d860 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61  mcpy(pPager->zWa
2d870 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2d880 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2d890 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57  mcpy(&pPager->zW
2d8a0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2d8b0 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b  -wal\000", 4+1);
2d8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2d8d0 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2d8e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d8f0 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66  r->zWal);.#endif
2d900 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2d910 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2d920 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
2d930 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
2d940 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
2d950 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
2d960 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
2d970 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2d980 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2d990 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2d9a0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9c0 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
2d9d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
2d9e0 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
2d9f0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2da00 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
2da10 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2da20 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
2da30 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  out);.    assert
2da40 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20  ( !memDb );.    
2da50 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
2da60 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2da70 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20  DONLY);..    /* 
2da80 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
2da90 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
2daa0 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
2dab0 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a  te access,.    *
2dac0 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
2dad0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
2dae0 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
2daf0 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a  create the.    *
2db00 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
2db10 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
2db20 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
2db30 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a  ximum of:.    **
2db40 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c  .    **    + SQL
2db50 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2db60 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20  _SIZE,.    **   
2db70 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
2db80 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2db90 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
2dba0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c     **    + The l
2dbb0 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65  argest page size
2dbc0 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69   that can be wri
2dbd0 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tten atomically.
2dbe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2dbf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2dc00 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d  .      int iDc =
2dc10 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
2dc20 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2dc30 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2dc40 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79     if( !readOnly
2dc50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53   ){.        setS
2dc60 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2dc70 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2dc80 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
2dc90 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
2dca0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2dcb0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
2dcc0 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
2dcd0 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
2dce0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2dcf0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
2dd00 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
2dd10 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2dd20 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
2dd30 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2dd40 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
2dd50 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
2dd60 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2dd70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2dd80 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70  ageDflt = (u32)p
2dd90 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2dda0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2ddb0 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20         }.#ifdef 
2ddc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2ddd0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2dde0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69     {.          i
2ddf0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20  nt ii;.         
2de00 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2de10 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
2de20 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
2de30 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2de40 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
2de50 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
2de60 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2de70 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
2de80 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2de90 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
2dea0 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
2deb0 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
2dec0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2ded0 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
2dee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2def0 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2df00 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2df10 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2df20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2df30 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ii;.           
2df40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2df50 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
2df60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
2df70 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73  ager->noLock = s
2df80 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2df90 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e  an(zFilename, "n
2dfa0 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20  olock", 0);.    
2dfb0 20 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c    if( (iDc & SQL
2dfc0 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41  ITE_IOCAP_IMMUTA
2dfd0 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  BLE)!=0.       |
2dfe0 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  | sqlite3_uri_bo
2dff0 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2e000 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29   "immutable", 0)
2e010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66   ){.          vf
2e020 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2e030 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
2e040 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
2e050 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c  ct_like_temp_fil
2e060 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2e070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2e080 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
2e090 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
2e0a0 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
2e0b0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
2e0c0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
2e0d0 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
2e0e0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2e0f0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
2e100 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
2e110 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
2e120 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
2e130 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
2e140 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2e150 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2e160 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
2e170 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2e180 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
2e190 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2e1a0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2e1b0 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
2e1c0 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2e1d0 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
2e1e0 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
2e1f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
2e200 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
2e210 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2e220 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73  branch also runs
2e230 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65   for files marke
2e240 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a  d as immutable..
2e250 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65      */ .act_like
2e260 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20  _temp_file:.    
2e270 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
2e280 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2e290 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2e2a0 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20       /* Pretend 
2e2b0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
2e2c0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50  a lock */.    pP
2e2d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58  ager->eLock = EX
2e2e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20  CLUSIVE_LOCK;   
2e2f0 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61   /* Pretend we a
2e300 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  re in EXCLUSIVE 
2e310 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67  mode */.    pPag
2e320 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20  er->noLock = 1; 
2e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e340 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  * Do no locking 
2e350 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  */.    readOnly 
2e360 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  = (vfsFlags&SQLI
2e370 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2e380 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
2e390 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
2e3a0 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73  to PagerSetPages
2e3b0 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20  ize() serves to 
2e3c0 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
2e3d0 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67   .  ** Pager.pag
2e3e0 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c  eSize and to all
2e3f0 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e  ocate the Pager.
2e400 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
2e410 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
2e420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e430 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e440 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
2e450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2e460 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
2e470 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66  Pager, &szPageDf
2e480 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  lt, -1);.    tes
2e490 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
2e4a0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
2e4b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2e4c0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2e4d0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2e4e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2e4f0 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30  sert( nExtra<100
2e500 30 20 29 3b 0a 20 20 20 20 6e 45 78 74 72 61 20  0 );.    nExtra 
2e510 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
2e520 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e530 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
2e540 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
2e550 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
2e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e570 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65  !memDb?pagerStre
2e580 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50  ss:0, (void *)pP
2e590 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50  ager, pPager->pP
2e5a0 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Cache);.  }..  /
2e5b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2e5c0 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72  curred above, fr
2e5d0 65 65 20 74 68 65 20 20 50 61 67 65 72 20 73 74  ee the  Pager st
2e5e0 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
2e5f0 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
2e600 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2e610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2e620 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2e630 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
2e640 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
2e650 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
2e660 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e670 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
2e680 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2e690 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
2e6a0 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
2e6b0 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
2e6c0 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
2e6d0 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
2e6e0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
2e6f0 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
2e700 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2e710 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
2e720 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
2e730 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70  eJournal;.  /* p
2e740 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
2e750 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e760 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
2e770 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e780 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
2e790 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e7a0 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
2e7b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2e7c0 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
2e7d0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
2e7e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2e7f0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
2e800 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
2e810 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
2e820 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
2e830 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50  LOCK; */.  /* pP
2e840 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
2e850 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2e860 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74  tempFile = (u8)t
2e870 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
2e880 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
2e890 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2e8a0 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
2e8b0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
2e8c0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2e8d0 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
2e8e0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
2e8f0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2e900 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
2e910 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2e920 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2e930 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   .  pPager->chan
2e940 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
2e950 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2e960 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
2e970 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
2e980 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
2e990 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a  = (u8)readOnly;.
2e9a0 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75    assert( useJou
2e9b0 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  rnal || pPager->
2e9c0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50  tempFile );.  pP
2e9d0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
2e9e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2e9f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
2ea00 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
2ea10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
2ea20 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  lSync==0 );.    
2ea30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ea40 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  syncFlags==0 );.
2ea50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ea60 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2ea70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2ea80 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  t( pPager->ckptS
2ea90 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2eaa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
2eab0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31  er->fullSync = 1
2eac0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  ;.    pPager->sy
2ead0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2eae0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2eaf0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
2eb00 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2eb10 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41  SYNC_NORMAL | WA
2eb20 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
2eb30 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ONS;.    pPager-
2eb40 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
2eb50 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2eb60 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  MAL;.  }.  /* pP
2eb70 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2eb80 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2eb90 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2eba0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ebb0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2ebc0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2ebd0 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2ebe0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2ebf0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2ec00 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2ec10 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2ec20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2ec30 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2ec40 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2ec50 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2ec60 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2ec70 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2ec80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2ec90 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2eca0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2ecb0 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2ecc0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2ecd0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2ece0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2ecf0 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2ed00 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2ed10 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2ed20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2ed30 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2ed40 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2ed50 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2ed60 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
2ed70 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
2ed80 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
2ed90 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50  sh)); */.  /* pP
2eda0 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53  ager->szMmap = S
2edb0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d  QLITE_DEFAULT_MM
2edc0 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20  AP_SIZE // will 
2edd0 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e  be set by btree.
2ede0 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72  c */..  *ppPager
2edf0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
2ee00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2ee10 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
2ee20 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
2ee30 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64  ile has not be d
2ee40 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65  eleted or rename
2ee50 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e  d out from.** un
2ee60 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20  der the pager.  
2ee70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2ee80 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2ee90 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69   is still were i
2eea0 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65  t ought.** to be
2eeb0 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72   on disk.  Retur
2eec0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49  n non-zero (SQLI
2eed0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
2eee0 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  VED or some othe
2eef0 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  r error.** code 
2ef00 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63  from sqlite3OsAc
2ef10 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64  cess()) if the d
2ef20 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65  atabase has gone
2ef30 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   missing..*/.sta
2ef40 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65  tic int database
2ef50 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20  IsUnmoved(Pager 
2ef60 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2ef70 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  bHasMoved = 0;. 
2ef80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
2ef90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2efa0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2efb0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
2efc0 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72  r->dbSize==0 ) r
2efd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2efe0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2eff0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  r->zFilename && 
2f000 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2f010 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73  e[0] );.  rc = s
2f020 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
2f030 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  rol(pPager->fd, 
2f040 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53  SQLITE_FCNTL_HAS
2f050 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76  _MOVED, &bHasMov
2f060 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ed);.  if( rc==S
2f070 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
2f080 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
2f090 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63  HAS_MOVED file-c
2f0a0 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c  ontrol is unimpl
2f0b0 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20  emented, assume 
2f0c0 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20  that the file.  
2f0d0 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
2f0e0 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69  n moved.  That i
2f0f0 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c  s the historical
2f100 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c   behavior of SQL
2f110 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20  ite: prior to.  
2f120 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38    ** version 3.8
2f130 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65  .3, it never che
2f140 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d  cked */.    rc =
2f150 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2f160 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2f170 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76  TE_OK && bHasMov
2f180 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
2f190 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
2f1a0 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65  BMOVED;.  }.  re
2f1b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2f1c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f1d0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2f1e0 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
2f1f0 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
2f200 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
2f210 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
2f220 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
2f230 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
2f240 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
2f250 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
2f260 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
2f270 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
2f280 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
2f290 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
2f2a0 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
2f2b0 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
2f2c0 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
2f2d0 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
2f2e0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
2f2f0 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
2f300 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
2f310 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2f320 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
2f330 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
2f340 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
2f350 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2f360 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2f370 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2f380 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
2f390 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2f3a0 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
2f3b0 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
2f3c0 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
2f3d0 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
2f3e0 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
2f3f0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f400 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
2f410 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2f420 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
2f430 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f440 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
2f450 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
2f460 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
2f470 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
2f480 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
2f490 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
2f4a0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
2f4b0 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
2f4c0 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
2f4d0 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
2f4e0 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
2f4f0 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
2f500 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
2f510 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
2f520 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
2f530 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f540 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
2f550 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
2f560 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2f570 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
2f580 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
2f590 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
2f5a0 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
2f5b0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
2f5c0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
2f5d0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2f5e0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2f5f0 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
2f600 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
2f610 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
2f620 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2f630 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
2f640 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
2f650 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
2f660 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2f670 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2f680 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
2f690 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
2f6a0 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
2f6b0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
2f6c0 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
2f6d0 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
2f6e0 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
2f6f0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
2f700 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
2f710 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2f720 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
2f730 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
2f740 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
2f750 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2f760 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2f770 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
2f780 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
2f790 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
2f7a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2f7b0 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
2f7c0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
2f7d0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2f7e0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
2f7f0 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
2f800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f810 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
2f820 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2f830 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
2f840 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
2f850 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
2f860 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
2f870 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2f880 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2f890 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
2f8a0 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
2f8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f8c0 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
2f8d0 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
2f8e0 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
2f8f0 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
2f900 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
2f910 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2f920 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
2f930 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2f940 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
2f950 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2f960 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2f970 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e  ;..  assert( jrn
2f980 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71  lOpen==0 || ( sq
2f990 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2f9a0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2f9b0 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20  ger->jfd) &.    
2f9c0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
2f9d0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
2f9e0 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78  EN.  ));..  *pEx
2f9f0 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  ists = 0;.  if( 
2fa00 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2fa10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2fa20 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
2fa30 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
2fa40 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2fa50 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
2fa60 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2fa70 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
2fa80 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
2fa90 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
2faa0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
2fab0 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
2fac0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2fad0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
2fae0 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
2faf0 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
2fb00 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
2fb10 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
2fb20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
2fb30 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
2fb40 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
2fb50 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
2fb60 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
2fb70 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
2fb80 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2fb90 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
2fba0 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
2fbb0 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
2fbc0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2fbd0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
2fbe0 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
2fbf0 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
2fc00 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
2fc10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2fc20 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
2fc30 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2fc40 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
2fc50 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
2fc60 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
2fc70 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
2fc80 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
2fc90 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
2fca0 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
2fcb0 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
2fcc0 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
2fcd0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2fce0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2fcf0 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
2fd00 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
2fd10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fd20 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
2fd30 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  {.      Pgno nPa
2fd40 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2fd50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fd60 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2fd70 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
2fd80 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
2fd90 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
2fda0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2fdb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2fdc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2fdd0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2fde0 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69  zero pages in si
2fdf0 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ze, that means t
2fe00 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20 74  hat either (1) t
2fe10 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
2fe20 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61  urnal is a remna
2fe30 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  nt from a prior 
2fe40 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2fe50 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72  e same name wher
2fe60 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
2fe70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
2fe80 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  ut not the journ
2fe90 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20  al was deleted, 
2fea0 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74 69  or (2) the initi
2feb0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  al.        ** tr
2fec0 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70  ansaction that p
2fed0 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64  opulates a new d
2fee0 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e 67  atabase is being
2fef0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
2ff00 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68        ** In eith
2ff10 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75  er case, the jou
2ff20 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65  rnal file can be
2ff30 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76   deleted.  Howev
2ff40 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20  er, take care.  
2ff50 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20        ** not to 
2ff60 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2ff70 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
2ff80 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75   already open du
2ff90 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
2ffa0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52  journal_mode=PER
2ffb0 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f  SIST..        */
2ffc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
2ffd0 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70  ge==0 && !jrnlOp
2ffe0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2fff0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
30000 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
30010 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c        if( pagerL
30020 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
30030 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51  SERVED_LOCK)==SQ
30040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
30060 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
30070 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
30080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
30090 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
300a0 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65  usiveMode ) page
300b0 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
300c0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
300d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
300e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
300f0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
30100 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30130 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  sts and no other
30140 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
30150 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20  a reserved.     
30160 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74       ** or great
30170 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
30180 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f  atabase file. No
30190 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
301a0 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
301b0 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
301c0 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61  non-zero bytes a
301d0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
301e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
301f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
30200 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20   there is, then 
30210 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  we consider this
30220 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68   journal to be h
30230 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20  ot. If not, .   
30240 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
30250 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20   be ignored..   
30260 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30270 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
30280 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
30290 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
302a0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
302b0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
302c0 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
302d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
302e0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
302f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
30300 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
30310 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  f);.          }.
30320 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30340 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69             u8 fi
30350 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rst = 0;.       
30360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30370 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
30380 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69  jfd, (void *)&fi
30390 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  rst, 1, 0);.    
303a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
303b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
303c0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
303d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
303e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
303f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30400 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
30410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30420 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
30430 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
30440 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30450 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
30460 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a  s = (first!=0);.
30470 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
30480 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
30490 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
304a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
304b0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  cannot open the 
304c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
304d0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
304e0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20  o see if.       
304f0 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61       ** it has a
30500 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68   zero header, th
30510 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  at might be due 
30520 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c  to an I/O error,
30530 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20   or.            
30540 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64  ** it might be d
30550 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63  ue to the race c
30560 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
30570 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a  ed above and in.
30580 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
30590 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69  icket #3883.  Ei
305a0 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65  ther way, assume
305b0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
305c0 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20  l is hot..      
305d0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
305e0 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70  ght be a false p
305f0 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66  ositive.  But if
30600 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65   it is, then the
30610 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30620 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61  automatic journa
30630 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72  l playback and r
30640 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73  ecovery mechanis
30650 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20  m will deal.    
30660 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
30670 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c  it under an EXCL
30680 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65  USIVE lock where
30690 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
306a0 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  to.            *
306b0 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20  * worry so much 
306c0 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74  with race condit
306d0 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20  ions..          
306e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
306f0 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20   *pExists = 1;. 
30700 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
30720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
30730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30740 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
30750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
30760 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
30770 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  d to obtain a sh
30780 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
30790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
307a0 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
307b0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
307c0 50 61 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c  PagerGet() until
307d0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
307e0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
307f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61   successfully ca
30800 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65  lled. If a share
30810 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  d-lock is alread
30820 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74  y held when.** t
30830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30840 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
30850 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
30860 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
30870 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70  tions are also p
30880 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73  erformed by this
30890 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
308a0 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
308b0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
308c0 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  in PAGER_OPEN st
308d0 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
308e0 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
308f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
30900 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
30910 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
30920 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
30930 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
30940 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
30950 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
30960 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
30970 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
30980 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
30990 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
309a0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
309b0 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
309c0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
309d0 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
309e0 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
309f0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
30a00 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
30a10 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
30a20 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
30a30 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
30a40 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
30a50 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
30a60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30a70 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
30a80 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
30a90 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
30aa0 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
30ab0 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
30ac0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
30ad0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
30ae0 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
30af0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
30b00 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
30b10 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
30b20 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
30b30 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
30b40 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
30b50 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
30b60 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
30b70 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
30b80 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
30b90 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
30ba0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
30bb0 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
30bc0 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
30bd0 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
30be0 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
30bf0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
30c00 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
30c10 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
30c20 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
30c30 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  r .** occurs whi
30c40 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
30c50 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
30c60 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
30c70 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20  nal file or .** 
30c80 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
30c90 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
30ca0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
30cb0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
30cc0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
30cd0 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
30ce0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30cf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
30d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d10 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30d20 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
30d30 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
30d40 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
30d50 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
30d60 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
30d70 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
30d80 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74  . This implies t
30d90 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74  hat the pager st
30da0 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65  ate should eithe
30db0 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f  r.  ** be OPEN o
30dc0 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52  r READER. READER
30dd0 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
30de0 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  e if the pager i
30df0 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  s or was in .  *
30e00 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  * exclusive acce
30e10 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ss mode..  */.  
30e20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30e30 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
30e40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
30e50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
30e60 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
30e70 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
30e80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
30e90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30ea0 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
30eb0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
30ec0 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  R );.  if( NEVER
30ed0 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  (MEMDB && pPager
30ee0 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65  ->errCode) ){ re
30ef0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
30f00 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21  Code; }..  if( !
30f10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
30f20 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65  er) && pPager->e
30f30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30f40 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f  N ){.    int bHo
30f50 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20  tJournal = 1;   
30f60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30f70 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
30f80 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   hot journal-fil
30f90 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
30fa0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20  ( !MEMDB );..   
30fb0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
30fc0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
30fd0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
30fe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30ff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
31000 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
31010 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
31020 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
31030 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
31040 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31050 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
31060 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
31070 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
31080 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
31090 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
310a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
310b0 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
310c0 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
310d0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
310e0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
310f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
31100 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
31110 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
31120 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
31130 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e  ager, &bHotJourn
31140 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
31150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31160 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
31170 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
31180 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   if( bHotJournal
31190 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
311a0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
311b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
311c0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
311d0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
311e0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
311f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
31200 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
31210 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31220 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
31230 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
31240 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
31250 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
31260 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
31270 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
31280 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
31290 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
312a0 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
312b0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
312c0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
312d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
312e0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
312f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
31300 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
31310 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
31320 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
31330 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
31340 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
31350 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
31360 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
31370 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
31380 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
31390 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
313a0 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
313b0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
313c0 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
313d0 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
313e0 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
313f0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
31400 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
31410 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
31420 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
31430 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
31440 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
31450 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
31460 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
31470 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31480 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31490 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
314a0 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e  ger is in lockin
314b0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
314c0 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
314d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e  is.      ** down
314e0 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44  graded to SHARED
314f0 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69  _LOCK before thi
31500 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
31510 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ns..      */.   
31520 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
31530 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
31540 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
31550 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31570 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31580 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31590 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
315a0 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68  eady open and th
315b0 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e  e file exists on
315c0 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20   disk, open the 
315d0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
315e0 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
315f0 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61   access. Write a
31600 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65  ccess is require
31610 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20  d because .     
31620 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65   ** in exclusive
31630 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
31640 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
31650 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
31660 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  en .      ** and
31670 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
31680 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
31690 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c   later on. Also,
316a0 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20   write-access . 
316b0 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c       ** is usual
316c0 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  ly required to f
316d0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
316e0 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  nal in journal_m
316f0 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20  ode=persist .   
31700 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20     ** mode (and 
31710 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c  also for journal
31720 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f  _mode=truncate o
31730 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e  n some systems).
31740 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31750 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
31760 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
31770 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61  , it usually mea
31780 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20  ns that some .  
31790 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
317a0 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20  nection managed 
317b0 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f  to get in and ro
317c0 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72  ll it back befor
317d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  e .      ** this
317e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
317f0 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
31800 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
31810 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  r, it .      ** 
31820 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68  may mean that th
31830 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74  e pager was in t
31840 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
31850 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a  hen this.      *
31860 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
31870 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  alled and the jo
31880 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
31890 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
318a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
318b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
318c0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  d) ){.        sq
318d0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
318e0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
318f0 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69  >pVfs;.        i
31900 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20  nt bExists;     
31910 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31920 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
31930 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
31940 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31950 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
31960 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
31970 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
31980 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
31990 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20  S, &bExists);.  
319a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
319b0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73  LITE_OK && bExis
319c0 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ts ){.          
319d0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
319e0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
319f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
31a00 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
31a10 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
31a20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31a30 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
31a40 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
31a50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
31a60 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
31a70 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
31a80 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
31a90 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
31aa0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31ab0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
31ac0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
31ad0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31ae0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
31af0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
31b00 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
31b10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31b20 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
31b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31b40 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31b50 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31b60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31b70 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
31b80 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
31b90 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
31ba0 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
31bb0 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
31bc0 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
31bd0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
31be0 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
31bf0 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
31c00 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
31c10 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
31c20 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
31c30 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
31c40 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
31c50 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
31c60 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
31c70 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
31c80 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
31c90 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
31ca0 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
31cb0 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
31cc0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
31cd0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
31ce0 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
31cf0 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
31d00 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
31d10 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
31d20 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
31d30 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
31d40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31d50 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
31d60 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
31d70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
31d80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
31d90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
31da0 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
31db0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
31dc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31de0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
31df0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
31e00 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
31e10 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
31e20 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  PEN;.        }. 
31e30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
31e40 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
31e50 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  eMode ){.       
31e60 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
31e70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31e80 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  CK);.      }..  
31e90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31ea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31eb0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
31ec0 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65  is taken if an e
31ed0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
31ee0 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  e trying to open
31ef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72  .        ** or r
31f00 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  oll back a hot-j
31f10 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c  ournal while hol
31f20 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
31f30 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
31f40 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c      ** pager_unl
31f50 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ock() routine wi
31f60 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  ll be called bef
31f70 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  ore returning to
31f80 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20   unlock.        
31f90 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  ** the file. If 
31fa0 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d  the unlock attem
31fb0 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50  pt fails, then P
31fc0 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20  ager.eLock must 
31fd0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
31fe0 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
31ff0 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  K (see the comme
32000 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
32010 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20  fine for .      
32020 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43    ** UNKNOWN_LOC
32030 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65  K above for an e
32040 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20  xplanation). .  
32050 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32060 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
32070 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  get pager_unlock
32080 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73  () to do this, s
32090 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  et Pager.eState 
320a0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41  to.        ** PA
320b0 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54  GER_ERROR now. T
320c0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
320d0 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61  lly counted as a
320e0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20   transition.    
320f0 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20      ** to ERROR 
32100 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61  state in the sta
32110 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68  te diagram at th
32120 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69  e top of this fi
32130 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  le,.        ** s
32140 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
32150 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20  t the same call 
32160 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
32170 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20  ) will very.    
32180 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74      ** shortly t
32190 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61  ransition the pa
321a0 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ger object to th
321b0 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61  e OPEN state. Ca
321c0 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
321d0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
321e0 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c  ate() would fail
321f0 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75   now, as it shou
32200 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ld not be possib
32210 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  le.        ** to
32220 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61   be in ERROR sta
32230 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  te when there ar
32240 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69  e zero outstandi
32250 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20  ng page .       
32260 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a   ** references..
32270 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32280 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
32290 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
322a0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
322b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
322c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
322d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
322e0 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EN );.      asse
322f0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
32300 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
32310 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
32320 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
32330 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
32340 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  >eLock>SHARED_LO
32350 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  CK).      );.   
32360 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
32370 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
32380 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
32390 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20  SharedLock ){.  
323a0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
323b0 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
323c0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 74 68  been acquired th
323d0 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20  en check to.    
323e0 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20    ** see if the 
323f0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
32400 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
32410 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
32420 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20   changed,.      
32430 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  ** flush the cac
32440 68 65 2e 20 20 54 68 65 20 68 61 73 48 65 6c 64  he.  The hasHeld
32450 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20  SharedLock flag 
32460 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66 72  prevents this fr
32470 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  om.      ** occu
32480 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72  rring on the ver
32490 79 20 66 69 72 73 74 20 61 63 63 65 73 73 20 74  y first access t
324a0 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64  o a file, in ord
324b0 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20  er to save a.   
324c0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e     ** single unn
324d0 65 63 65 73 73 61 72 79 20 73 71 6c 69 74 65 33  ecessary sqlite3
324e0 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74  OsRead() call at
324f0 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20   the start-up.. 
32500 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
32510 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
32520 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  s are detected b
32530 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
32540 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
32550 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
32560 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
32570 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
32580 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
32590 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
325a0 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
325b0 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
325c0 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
325d0 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
325e0 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
325f0 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
32600 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
32610 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
32620 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
32630 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
32640 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
32650 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
32660 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
32670 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
32680 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
32690 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
326a0 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
326b0 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
326c0 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
326d0 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
326e0 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
326f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32700 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a  Pgno nPage = 0;.
32710 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
32720 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
32730 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
32740 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ];..      rc = p
32750 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
32760 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
32770 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
32780 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20  to failed;..    
32790 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
327a0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
327b0 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
327c0 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
327d0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
327e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
327f0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
32800 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
32810 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
32820 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
32830 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32840 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
32850 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
32860 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
32870 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
32880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
328a0 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
328b0 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
328c0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
328d0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
328e0 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
328f0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
32900 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
32910 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
32920 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
32930 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
32940 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74        /* Unmap t
32950 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32960 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
32970 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70   that external p
32980 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20  rocesses.       
32990 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75   ** may have tru
329a0 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62  ncated the datab
329b0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
329c0 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61  n extended it ba
329d0 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ck.        ** to
329e0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
329f0 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ze while this pr
32a00 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f  ocess was not ho
32a10 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20  lding a lock..  
32a20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
32a30 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20   case there may 
32a40 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d  exist a Pager.pM
32a50 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20  ap mapping that 
32a60 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20  appears.        
32a70 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67  ** to be the rig
32a80 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e  ht size but is n
32a90 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69  ot actually vali
32aa0 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20  d. Avoid this.  
32ab0 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69        ** possibi
32ac0 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e  lity by unmappin
32ad0 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a  g the db here. *
32ae0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53  /.        if( US
32af0 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
32b00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
32b10 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
32b20 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
32b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32b40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
32b50 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41  If there is a WA
32b60 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  L file in the fi
32b70 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20  le-system, open 
32b80 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e  this database in
32b90 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65   WAL.    ** mode
32ba0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
32bb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
32bc0 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  ion call is a no
32bd0 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  -op..    */.    
32be0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61  rc = pagerOpenWa
32bf0 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65  lIfPresent(pPage
32c00 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
32c10 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
32c20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32c30 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  pWal==0 || rc==S
32c40 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64  QLITE_OK );.#end
32c50 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  if.  }..  if( pa
32c60 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32c70 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
32c80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32c90 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
32ca0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
32cb0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
32cc0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
32cd0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32ce0 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  PEN && rc==SQLIT
32cf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
32d00 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
32d10 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
32d20 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
32d30 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
32d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32d50 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
32d60 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75  B );.    pager_u
32d70 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
32d80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32d90 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32da0 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65  _OPEN );.  }else
32db0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  {.    pPager->eS
32dc0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
32dd0 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  DER;.    pPager-
32de0 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
32df0 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ck = 1;.  }.  re
32e00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
32e10 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
32e20 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
32e30 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
32e40 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
32e50 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
32e60 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
32e70 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
32e80 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
32e90 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
32ea0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
32eb0 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
32ec0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
32ed0 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
32ee0 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
32ef0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
32f00 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
32f10 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
32f20 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
32f30 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
32f40 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
32f50 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
32f60 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
32f70 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28  nMmapOut==0 && (
32f80 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
32f90 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
32fa0 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20  Cache)==0) ){.  
32fb0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
32fc0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
32fd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
32fe0 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
32ff0 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
33000 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
33010 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
33020 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
33030 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
33040 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
33050 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
33060 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
33070 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
33080 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
33090 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
330a0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
330b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
330c0 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
330d0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
330e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
330f0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
33100 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
33110 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
33120 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
33130 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
33140 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33150 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
33160 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
33170 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
33180 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
33190 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
331a0 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
331b0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
331c0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
331d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
331e0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
331f0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
33200 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
33210 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
33220 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
33230 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
33240 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
33250 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
33260 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
33270 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
33280 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
33290 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
332a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
332b0 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
332c0 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
332d0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
332e0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
332f0 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
33300 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
33310 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
33320 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
33330 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
33340 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
33350 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
33360 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
33370 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
33380 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
33390 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
333a0 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
333b0 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
333c0 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
333d0 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
333e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
333f0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
33400 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
33410 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
33420 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
33430 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
33440 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
33450 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
33460 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
33470 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
33480 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
33490 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61  urs in two scena
334a0 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
334b0 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
334c0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
334d0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
334e0 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
334f0 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
33500 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
33510 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
33520 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
33530 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
33540 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
33550 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
33560 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
33570 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
33580 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
33590 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
335a0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
335b0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
335c0 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
335d0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
335e0 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
335f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
33600 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
33610 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
33620 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
33630 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
33640 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
33650 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
33660 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
33670 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
33680 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
33690 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
336a0 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
336b0 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
336c0 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
336d0 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
336e0 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
336f0 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
33700 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
33710 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
33720 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
33730 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
33740 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
33750 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
33760 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
33770 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
33780 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
33790 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
337a0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
337b0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
337c0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
337d0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
337e0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
337f0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
33800 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
33810 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
33820 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
33830 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
33840 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
33850 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
33860 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
33870 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
33880 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
33890 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
338a0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
338b0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
338c0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
338d0 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
338e0 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
338f0 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
33900 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
33910 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
33920 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
33930 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
33940 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
33950 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
33960 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
33970 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
33980 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
33990 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
339a0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
339b0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
339c0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
339d0 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20 50  te3PagerGet(.  P
339e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
339f0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
33a00 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
33a10 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
33a20 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
33a30 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
33a40 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
33a50 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
33a60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
33a70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
33a80 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
33a90 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
33aa0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58   /* PAGER_GET_XX
33ab0 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  X flags */.){.  
33ac0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
33ad0 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  OK;.  PgHdr *pPg
33ae0 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61   = 0;.  u32 iFra
33af0 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  me = 0;         
33b00 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65          /* Frame
33b10 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41   to read from WA
33b20 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  L file */.  cons
33b30 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20  t int noContent 
33b40 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
33b50 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b  _GET_NOCONTENT);
33b60 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
33b70 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
33b80 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
33b90 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
33ba0 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
33bb0 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
33bc0 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
33bd0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
33be0 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
33bf0 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
33c00 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
33c10 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
33c20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
33c30 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
33c40 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
33c50 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
33c60 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
33c70 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
33c80 6f 3e 31 20 26 26 20 55 53 45 46 45 54 43 48 28  o>1 && USEFETCH(
33c90 70 50 61 67 65 72 29 0a 20 20 20 26 26 20 28 70  pPager).   && (p
33ca0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33cb0 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28  AGER_READER || (
33cc0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
33cd0 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66  T_READONLY)).#if
33ce0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
33cf0 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61 67 65  ODEC.   && pPage
33d00 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e  r->xCodec==0.#en
33d10 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f  dif.  );..  /* O
33d20 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65  ptimization note
33d30 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20 22 70  :  Adding the "p
33d40 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65 66  gno<=1" term bef
33d50 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65  ore "pgno==0" he
33d60 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74  re.  ** allows t
33d70 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  he compiler opti
33d80 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20 74  mizer to reuse t
33d90 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
33da0 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20  e "pgno>1".  ** 
33db0 74 65 73 74 20 69 6e 20 74 68 65 20 70 72 65 76  test in the prev
33dc0 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c 20  ious statement, 
33dd0 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69 6e  and avoid testin
33de0 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65  g pgno==0 in the
33df0 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73  .  ** common cas
33e00 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73 20  e where pgno is 
33e10 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  large. */.  if( 
33e20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d  pgno<=1 && pgno=
33e30 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
33e40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
33e50 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
33e60 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
33e70 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
33e80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
33e90 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
33ea0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
33eb0 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d  sert( noContent=
33ec0 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30  =0 || bMmapOk==0
33ed0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
33ee0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
33ef0 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a  aredLock==1 );..
33f00 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
33f10 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
33f20 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
33f30 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
33f40 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
33f50 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
33f60 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
33f70 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
33f80 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
33f90 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
33fa0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
33fb0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
33fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
33fd0 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65   bMmapOk && page
33fe0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
33ff0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
34000 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
34010 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
34020 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
34030 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34040 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
34050 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34060 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
34070 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
34080 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  me==0 ){.      v
34090 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
340a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
340b0 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65  te3OsFetch(pPage
340c0 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20  r->fd, .        
340d0 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20    (i64)(pgno-1) 
340e0 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
340f0 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ze, pPager->page
34100 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20  Size, &pData.   
34110 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28     );..      if(
34120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
34130 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  & pData ){.     
34140 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
34150 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44  State>PAGER_READ
34160 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ER ){.          
34170 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
34180 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
34190 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
341a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
341b0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
341c0 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
341d0 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
341e0 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
341f0 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  &pPg);.        }
34200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34210 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
34220 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
34230 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  4)(pgno-1)*pPage
34240 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
34250 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta);.        }. 
34260 20 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29         if( pPg )
34270 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
34280 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
34290 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  K );.          *
342a0 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
342b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
342c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
342d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
342e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
342f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
34300 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34310 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34320 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20 20     }..    {.    
34330 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65    sqlite3_pcache
34340 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20 20  _page *pBase;.  
34350 20 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69      pBase = sqli
34360 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
34370 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34380 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
34390 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a  if( pBase==0 ){.
343a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
343b0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 53  ite3PcacheFetchS
343c0 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50  tress(pPager->pP
343d0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42  Cache, pgno, &pB
343e0 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ase);.        if
343f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34400 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
34410 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34420 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29    if( pBase==0 )
34430 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 20  {.          pPg 
34440 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20  = *ppPage = 0;. 
34450 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
34460 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
34470 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34480 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
344a0 20 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50        pPg = *ppP
344b0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
344c0 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70  cheFetchFinish(p
344d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
344e0 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20  pgno, pBase);.  
344f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 21      assert( pPg!
34500 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
34510 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
34520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
34530 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
34540 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
34550 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
34560 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
34570 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
34580 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
34590 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
345a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
345b0 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
345c0 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
345d0 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
345e0 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
345f0 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
34600 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
34610 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34620 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
34630 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20  ==(*ppPage) );. 
34640 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
34650 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
34660 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
34670 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67  r==pPager || pPg
34680 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
34690 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
346a0 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
346b0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
346c0 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
346d0 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
346e0 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
346f0 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
34700 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
34710 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
34720 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
34730 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
34740 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
34750 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
34760 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
34770 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
34780 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b  PAGER_STAT_HIT]+
34790 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  +;.    return SQ
347a0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
347b0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
347c0 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
347d0 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
347e0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
347f0 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
34800 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
34810 2a 2f 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  */..    pPg->pPa
34820 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
34830 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
34840 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
34850 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
34860 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
34870 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
34880 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
34890 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
348a0 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
348b0 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
348c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
348d0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
348e0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
348f0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34900 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
34910 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34920 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
34930 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34940 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
34950 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
34960 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
34970 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73  noContent || !is
34980 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
34990 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
349a0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
349b0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
349c0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
349d0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
349e0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
349f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34a00 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
34a10 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
34a20 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
34a30 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
34a40 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
34a50 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
34a60 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
34a70 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
34a80 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
34a90 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
34aa0 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
34ab0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
34ac0 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
34ad0 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
34ae0 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
34af0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
34b00 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
34b10 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
34b20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
34b30 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
34b40 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
34b50 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
34b60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34b70 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
34b80 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
34b90 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
34ba0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
34bb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
34bc0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
34bd0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
34be0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
34bf0 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
34c00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34c20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
34c30 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
34c40 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
34c50 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
34c60 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
34c70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
34c80 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
34c90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34ca0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
34cb0 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
34cc0 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
34cd0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
34ce0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
34cf0 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
34d00 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
34d10 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
34d20 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
34d30 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
34d40 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30  r) && bMmapOk==0
34d50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34d60 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
34d70 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
34d80 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
34d90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34da0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34db0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34dc0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34dd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
34de0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
34df0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
34e00 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
34e10 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20  AT_MISS]++;.    
34e20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
34e30 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
34e40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34e50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34e60 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34e70 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34e80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
34e90 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
34ea0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
34eb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
34ec0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34ed0 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
34ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
34ef0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
34f00 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
34f10 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
34f20 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
34f30 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70  (pPager);..  *pp
34f40 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
34f50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
34f60 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
34f70 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
34f80 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
34f90 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
34fa0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
34fb0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
34fc0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
34fd0 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
34fe0 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
34ff0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
35000 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
35010 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
35020 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
35030 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
35040 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
35050 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
35060 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
35070 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
35080 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
35090 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
350a0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
350b0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
350c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
350d0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
350e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
350f0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
35100 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
35110 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
35120 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
35130 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
35140 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
35150 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
35160 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  {.  sqlite3_pcac
35170 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a  he_page *pPage;.
35180 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35190 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
351a0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
351b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
351c0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50  Cache!=0 );.  pP
351d0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
351e0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
351f0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
35200 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  0);.  assert( pP
35210 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  age==0 || pPager
35220 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
35230 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ock );.  if( pPa
35240 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
35250 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
35260 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
35270 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
35280 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  che, pgno, pPage
35290 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
352a0 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
352b0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
352c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
352d0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
352e0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
352f0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
35300 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
35310 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
35320 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
35330 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
35340 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
35350 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
35360 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
35370 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
35380 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
35390 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
353a0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44  erUnrefNotNull(D
353b0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
353c0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
353d0 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29  assert( pPg!=0 )
353e0 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67  ;.  pPager = pPg
353f0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
35400 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
35410 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70  DR_MMAP ){.    p
35420 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
35430 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65  ge(pPg);.  }else
35440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
35450 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
35460 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
35470 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
35480 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  r);.}.void sqlit
35490 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
354a0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
354b0 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61   pPg ) sqlite3Pa
354c0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
354d0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pPg);.}../*.** T
354e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
354f0 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
35500 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
35510 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
35520 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
35530 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
35540 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
35550 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
35560 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
35570 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
35580 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
35590 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
355a0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
355b0 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
355c0 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
355d0 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
355e0 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
355f0 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
35600 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
35610 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
35620 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
35630 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
35640 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
35650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
35660 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
35670 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
35680 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
35690 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
356a0 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
356b0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
356c0 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
356d0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
356e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
356f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
35700 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
35710 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
35720 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
35730 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
35740 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
35750 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
35760 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
35770 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
35780 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
35790 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
357a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
357b0 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
357c0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
357d0 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
357e0 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
357f0 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
35800 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
35810 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
35820 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
35830 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
35840 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
35850 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
35860 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
35870 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
35880 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
35890 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
358a0 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
358b0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
358c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
358d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
358e0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
358f0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
35900 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
35910 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
35920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35930 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
35940 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
35950 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
35960 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
35970 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
35980 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
35990 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
359a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
359b0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
359c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
359d0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
359e0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
359f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
35a00 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
35a10 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
35a20 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
35a30 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
35a40 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
35a50 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
35a60 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
35a70 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
35a80 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
35a90 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
35aa0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
35ab0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
35ac0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
35ad0 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
35ae0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
35af0 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
35b00 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
35b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
35b20 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35b30 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50  DE_OFF ){.    pP
35b40 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35b50 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
35b60 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
35b70 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
35b80 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35b90 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
35ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
35bb0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  EM;.    }.  .   
35bc0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
35bd0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
35be0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
35bf0 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  pen. */.    if( 
35c00 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
35c10 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
35c20 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
35c30 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
35c40 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
35c50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
35c60 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
35c70 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
35c80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35c90 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
35ca0 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20  ags =           
35cb0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
35cc0 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75  lags to open jou
35cd0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20  rnal file */.   
35ce0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
35cf0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
35d00 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
35d10 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
35d20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a  er->tempFile ? .
35d30 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
35d40 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
35d50 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
35d60 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
35d70 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53  :.            (S
35d80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
35d90 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20  JOURNAL).       
35da0 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f     );..        /
35db0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
35dc0 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c  e database still
35dd0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
35de0 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65  me as it did whe
35df0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  n.        ** it 
35e00 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  was originally o
35e10 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  pened. */.      
35e20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49    rc = databaseI
35e30 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29  sUnmoved(pPager)
35e40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35e50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
35e60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
35e70 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
35e80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35e90 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
35ea0 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
35eb0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
35ec0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
35ed0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
35ee0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
35ef0 67 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 29  ger).          )
35f00 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
35f10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
35f20 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
35f30 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
35f40 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
35f50 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
35f60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35f70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
35f80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
35f90 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
35fa0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
35fb0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
35fc0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
35fd0 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
35fe0 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
35ff0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
36000 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
36010 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
36020 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
36040 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
36050 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
36060 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
36070 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
36080 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
36090 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
360a0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
360b0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
360c0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
360d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
360e0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
360f0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
36100 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
36110 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
36120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36130 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
36140 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
36150 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
36160 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36170 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
36180 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36190 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
361a0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
361b0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
361c0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
361d0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
361e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
361f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
36200 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
36210 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
36220 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
36230 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
36240 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
36250 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
36260 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
36270 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
36280 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
36290 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
362a0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
362b0 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
362c0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
362d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
362e0 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
362f0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
36300 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
36310 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
36320 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
36330 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
36340 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
36350 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
36360 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
36370 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
36380 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
36390 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
363a0 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
363b0 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
363c0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
363d0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
363e0 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
363f0 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
36400 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
36410 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
36420 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
36430 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
36440 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
36450 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
36460 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
36470 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
36480 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
36490 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
364a0 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
364b0 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
364c0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
364d0 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
364e0 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
364f0 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
36500 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
36510 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
36520 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
36530 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
36540 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
36550 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
36560 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
36570 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
36580 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
36590 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
365a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
365b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
365c0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
365d0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
365e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
365f0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
36600 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
36610 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
36620 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
36630 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
36640 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
36650 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pPag
36660 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36670 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20  R_READER) ){.   
36680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36690 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
366a0 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
366b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
366c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
366d0 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
366e0 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
366f0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
36700 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
36710 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
36720 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
36730 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
36740 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
36750 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
36760 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
36770 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
36780 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
36790 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
367a0 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
367b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
367c0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
367d0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
367e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
367f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36800 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
36810 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
36820 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
36830 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
36840 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
36850 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 1);.      }..
36860 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68        /* Grab th
36870 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
36880 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
36890 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67   successful, upg
368a0 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rade to.      **
368b0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
368c0 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
368d0 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
368e0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
368f0 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ller..      ** T
36900 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
36910 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69  is not invoked i
36920 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  f another connec
36930 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20  tion already.   
36940 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20     ** holds the 
36950 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70  write-lock. If p
36960 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70  ossible, the upp
36970 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61  er layer will ca
36980 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ll it..      */.
36990 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
369a0 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
369b0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
369c0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65  r->pWal);.    }e
369d0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
369e0 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
369f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
36a00 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
36a10 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
36a20 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
36a30 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
36a40 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
36a50 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
36a60 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
36a70 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
36a80 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
36a90 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
36aa0 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
36ab0 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
36ac0 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
36ad0 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
36ae0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
36af0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36b00 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
36b10 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
36b20 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
36b30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36b40 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20   && exFlag ){.  
36b50 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36b60 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
36b70 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
36b80 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
36b90 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
36ba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36bb0 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
36bc0 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  o WRITER_LOCKED 
36bd0 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
36be0 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
36bf0 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
36c00 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
36c10 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41  TER_LOCKED or CA
36c20 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20  CHEMOD.      ** 
36c30 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
36c40 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
36c50 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42   but never to DB
36c60 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e  MOD or FINISHED.
36c70 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
36c80 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f  s because in tho
36c90 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f  se states the co
36ca0 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
36cb0 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
36cc0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
36cd0 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
36ce0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
36cf0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
36d00 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  abase .      ** 
36d10 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20  file as well as 
36d20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
36d30 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
36d40 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
36d50 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d   .      ** WAL m
36d60 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
36d70 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
36d80 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
36d90 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  R_LOCKED;.      
36da0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
36db0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
36dc0 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
36dd0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
36de0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
36df0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
36e00 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
36e10 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
36e20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36e30 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Off = 0;.    }..
36e40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
36e50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
36e60 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36e70 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
36e80 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
36e90 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
36ea0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36eb0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
36ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
36ed0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
36ee0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
36ef0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
36f00 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
36f10 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
36f20 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
36f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
36f40 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74   page pPg onto t
36f50 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f  he end of the ro
36f60 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
36f70 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
36f80 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61  _NOINLINE int pa
36f90 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
36fa0 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64  backJournal(PgHd
36fb0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
36fc0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
36fd0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
36fe0 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
36ff0 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
37000 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
37010 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
37020 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20  .  /* We should 
37030 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
37040 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37050 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
37060 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
37070 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
37080 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
37090 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
370a0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
370b0 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ot. */.  assert(
370c0 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
370d0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
370e0 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
370f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
37100 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
37110 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45  nalOff );.  CODE
37120 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C2(pPager, pPg->
37130 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
37140 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
37150 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
37160 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61 67  );.  cksum = pag
37170 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
37180 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a   (u8*)pData2);..
37190 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
371a0 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
371b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
371c0 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
371d0 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  e.  ** page in t
371e0 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
371f0 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
37200 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
37210 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  age..  ** Otherw
37220 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
37230 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
37240 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
37250 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79  gic in.  ** play
37260 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
37270 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
37280 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
37290 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
372a0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
372b0 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
372c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
372d0 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
372e0 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72  o,.  ** then cor
372f0 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
37300 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  ow..  */.  pPg->
37310 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
37320 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20  EED_SYNC;..  rc 
37330 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
37340 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c  ager->jfd, iOff,
37350 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69   pPg->pgno);.  i
37360 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37370 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37380 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
37390 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
373a0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
373b0 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b  >pageSize, iOff+
373c0 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
373d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
373e0 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72 69 74   rc;.  rc = writ
373f0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
37400 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
37410 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
37420 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
37430 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37440 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43  rn rc;..  IOTRAC
37450 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
37460 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
37470 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
37480 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
37490 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
374a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
374b0 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ;.  PAGER_INCR(s
374c0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
374d0 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  tej_count);.  PA
374e0 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
374f0 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
37500 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
37510 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
37520 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
37530 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
37540 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
37550 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
37560 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
37570 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
37580 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
37590 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
375a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
375b0 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
375c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
375d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
375e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
375f0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
37600 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
37610 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73  Pg->pgno);.  tes
37620 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
37630 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73  E_NOMEM );.  ass
37640 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
37650 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
37660 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c  _NOMEM );.  rc |
37670 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
37680 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
37690 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73  pPg->pgno);.  as
376a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
376b0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
376c0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74  E_NOMEM );.  ret
376d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
376e0 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
376f0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
37700 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
37710 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
37720 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
37730 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
37740 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
37750 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
37760 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
37770 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
37780 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
37790 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
377a0 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
377b0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
377c0 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
377d0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
377e0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
377f0 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
37800 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
37810 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
37820 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
37830 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
37840 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
37850 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
37860 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37870 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
37880 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
37890 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
378a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
378b0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a  on has already .
378c0 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65    ** been starte
378d0 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d. The journal f
378e0 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ile may or may n
378f0 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68  ot be open at th
37900 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49  is point..  ** I
37910 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  t is never calle
37920 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  d in the ERROR s
37930 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tate..  */.  ass
37940 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37950 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37960 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
37970 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37980 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37990 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
379a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
379b0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
379c0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
379d0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
379e0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
379f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37a00 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20  ger->errCode==0 
37a10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37a20 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ger->readOnly==0
37a30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41 47 45   );.  CHECK_PAGE
37a40 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  (pPg);..  /* The
37a50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
37a60 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  eds to be opened
37a70 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  . Higher level r
37a80 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
37a90 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  eady.  ** obtain
37aa0 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
37ab0 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20   locks to begin 
37ac0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
37ad0 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20  ction, but the. 
37ae0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
37af0 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
37b00 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
37b10 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
37b20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
37b30 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64  *.  ** This is d
37b40 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  one before calli
37b50 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
37b60 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74  MakeDirty() on t
37b70 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f  he page. .  ** O
37b80 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20  therwise, if it 
37b90 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20  were done after 
37ba0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
37bb0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
37bc0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65  , then.  ** an e
37bd0 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72  rror might occur
37be0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77   and the pager w
37bf0 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57  ould end up in W
37c00 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
37c10 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67  te.  ** with pag
37c20 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  es marked as dir
37c30 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ty in the cache.
37c40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
37c50 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37c60 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37c70 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
37c80 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
37c90 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
37ca0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37cb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
37cc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37cd0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
37ce0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
37cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
37d00 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
37d10 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
37d20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 74 68  Mark the page th
37d30 61 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  at is about to b
37d40 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 64 69  e modified as di
37d50 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rty. */.  sqlite
37d60 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
37d70 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
37d80 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
37d90 61 6c 20 69 73 20 69 6e 20 75 73 65 2c 20 74 68  al is in use, th
37da0 65 6d 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  em make sure the
37db0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 61 62   page that is ab
37dc0 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e  out.  ** to chan
37dd0 67 65 20 69 73 20 69 6e 20 74 68 65 20 72 6f 6c  ge is in the rol
37de0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f  lback journal, o
37df0 72 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  r if the page is
37e00 20 61 20 6e 65 77 20 70 61 67 65 20 6f 66 66 0a   a new page off.
37e10 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64 20 6f 66    ** then end of
37e20 20 74 68 65 20 66 69 6c 65 2c 20 6d 61 6b 65 20   the file, make 
37e30 73 75 72 65 20 69 74 20 69 73 20 6d 61 72 6b 65  sure it is marke
37e40 64 20 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f  d as PGHDR_NEED_
37e50 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  SYNC..  */.  ass
37e60 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 70 49  ert( (pPager->pI
37e70 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20 3d 3d 20  nJournal!=0) == 
37e80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
37e90 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
37ea0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
37eb0 3d 30 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  =0.   && sqlite3
37ec0 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
37ed0 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  l(pPager->pInJou
37ee0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
37ef0 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  ==0.  ){.    ass
37f00 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
37f10 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
37f20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
37f30 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
37f40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
37f50 20 3d 20 70 61 67 65 72 41 64 64 50 61 67 65 54   = pagerAddPageT
37f60 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c  oRollbackJournal
37f70 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
37f80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37f90 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
37fa0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
37fc0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37fd0 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
37fe0 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
37ff0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
38000 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
38010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47       }.      PAG
38020 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
38030 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
38040 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
38050 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
38060 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
38070 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
38080 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
38090 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
380a0 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 7d 0a 20  ?1:0)));.    }. 
380b0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 47 48   }..  /* The PGH
380c0 44 52 5f 44 49 52 54 59 20 62 69 74 20 69 73 20  DR_DIRTY bit is 
380d0 73 65 74 20 61 62 6f 76 65 20 77 68 65 6e 20 74  set above when t
380e0 68 65 20 70 61 67 65 20 77 61 73 20 61 64 64 65  he page was adde
380f0 64 20 74 6f 20 74 68 65 20 64 69 72 74 79 2d 6c  d to the dirty-l
38100 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20 62 65 66  ist.  ** and bef
38110 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 65 20  ore writing the 
38120 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 72 6f  page into the ro
38130 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
38140 20 57 61 69 74 20 75 6e 74 69 6c 20 6e 6f 77 2c   Wait until now,
38150 0a 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20  .  ** after the 
38160 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 73 75  page has been su
38170 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f 75 72 6e  ccessfully journ
38180 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65 20 73 65  alled, before se
38190 74 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 50  tting the.  ** P
381a0 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45 20 62  GHDR_WRITEABLE b
381b0 69 74 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  it that indicate
381c0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
381d0 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 6d 6f  can be safely mo
381e0 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  dified..  */.  p
381f0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
38200 44 52 5f 57 52 49 54 45 41 42 4c 45 3b 0a 20 20  DR_WRITEABLE;.  
38210 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
38220 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
38230 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
38240 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
38250 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74  ,.  ** then writ
38260 65 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  e the page into 
38270 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
38280 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
38290 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
382a0 6f 69 6e 74 3e 30 20 29 7b 0a 20 20 20 20 72 63  oint>0 ){.    rc
382b0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
382c0 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29  eIfRequired(pPg)
382d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
382e0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
382f0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
38300 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
38310 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
38320 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
38330 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
38340 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
38350 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
38360 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61 6e  This is a varian
38370 74 20 6f 66 20 73 71 6c 69 74 65 33 50 61 67 65  t of sqlite3Page
38380 72 57 72 69 74 65 28 29 20 74 68 61 74 20 72 75  rWrite() that ru
38390 6e 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 74  ns when the sect
383a0 6f 72 20 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61  or size.** is la
383b0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
383c0 67 65 20 73 69 7a 65 2e 20 20 53 51 4c 69 74 65  ge size.  SQLite
383d0 20 6d 61 6b 65 73 20 74 68 65 20 28 72 65 61 73   makes the (reas
383e0 6f 6e 61 62 6c 65 29 20 61 73 73 75 6d 70 74 69  onable) assumpti
383f0 6f 6e 20 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62  on that.** all b
38400 79 74 65 73 20 6f 66 20 61 20 73 65 63 74 6f 72  ytes of a sector
38410 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 67   are written tog
38420 65 74 68 65 72 20 62 79 20 68 61 72 64 77 61 72  ether by hardwar
38430 65 2e 20 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62  e.  Hence, all b
38440 79 74 65 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63  ytes of.** a sec
38450 74 6f 72 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  tor need to be j
38460 6f 75 72 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73  ournalled in cas
38470 65 20 6f 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  e of a power los
38480 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  s in the middle 
38490 6f 66 0a 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a  of.** a write..*
384a0 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
384b0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
384c0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
384d0 75 61 6c 20 74 6f 20 74 68 65 20 70 61 67 65 20  ual to the page 
384e0 73 69 7a 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a  size, in which.*
384f0 2a 20 63 61 73 65 20 70 61 67 65 73 20 63 61 6e  * case pages can
38500 20 62 65 20 69 6e 64 69 76 69 64 75 61 6c 6c 79   be individually
38510 20 77 72 69 74 74 65 6e 2e 20 20 54 68 69 73 20   written.  This 
38520 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e  routine only run
38530 73 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 63 65  s in the.** exce
38540 70 74 69 6f 6e 61 6c 20 63 61 73 65 20 77 68 65  ptional case whe
38550 72 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  re the page size
38560 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
38570 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
38580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
38590 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
385a0 70 61 67 65 72 57 72 69 74 65 4c 61 72 67 65 53  pagerWriteLargeS
385b0 65 63 74 6f 72 28 50 67 48 64 72 20 2a 70 50 67  ector(PgHdr *pPg
385c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
385d0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
385e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
385f0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65   */.  Pgno nPage
38600 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
38610 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
38620 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
38630 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
38640 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
38650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38660 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
38670 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
38680 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
38690 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30  .  int nPage = 0
386a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
386b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
386c0 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
386d0 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
386