/ Hex Artifact Content
Login

Artifact 7e745749c375e3c35ef92051e2c1f7425cfcb3de:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7140: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7150: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7160: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7170: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7180: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7190: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
71a0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71b0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71c0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71d0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71e0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
7200: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7210: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7220: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7240: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7250: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7260: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7270: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7280: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7290: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
72a0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72b0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72d0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72f0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
7300: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7320: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7330: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7340: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7350: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7360: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7370: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7380: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7390: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
73a0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73b0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73c0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73d0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73e0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
7400: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7410: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7420: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7430: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7440: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7450: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7460: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7470: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7490: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
74a0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74f0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7550: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7560: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7570: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7580: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7590: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
75a0: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75b0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75c0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75d0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75e0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75f0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7600: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7610: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7620: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7630: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7640: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7650: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7660: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7680: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7690: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
76a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76b0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76c0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76d0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76e0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76f0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7700: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7710: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7720: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7750: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7760: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7770: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
77a0: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77e0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77f0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7800: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7810: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7820: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7830: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7840: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7850: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7860: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7880: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7890: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
78a0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78b0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78c0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78d0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78e0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78f0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
7900: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7910: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7920: 0a 20 20 75 38 20 68 61 73 42 65 65 6e 55 73 65  .  u8 hasBeenUse
7930: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
7940: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 63 6f  * True if any co
7950: 6e 74 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79  ntent previously
7960: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 69 73 20   read from this 
7970: 70 61 67 65 72 2a 2f 0a 20 20 50 67 6e 6f 20 64  pager*/.  Pgno d
7980: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
7990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
79a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
79b0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
79c0: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
79d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
79e0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
79f0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7a00: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
7a10: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
7a20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7a30: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
7a40: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7a50: 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65   Pgno dbHintSize
7a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7a70: 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  Value passed to 
7a80: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
7a90: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72  call */.  int er
7aa0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
7ab0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7ac0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
7ad0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
7ae0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
7b00: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
7b10: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
7b20: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
7b30: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
7b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
7b50: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
7b60: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
7b70: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
7b80: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
7b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7ba0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
7bb0: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
7bc0: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
7bd0: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
7be0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
7bf0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
7c00: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7c10: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
7c20: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
7c30: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7c40: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
7c50: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
7c60: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
7c70: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7c80: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
7c90: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
7ca0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
7cb0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
7cc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7cd0: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
7ce0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
7cf0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
7d00: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
7d10: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
7d20: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7d30: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7d50: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
7d60: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
7d70: 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  eader */.  sqlit
7d80: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
7d90: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
7da0: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
7db0: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
7dc0: 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  esses */.  Pager
7dd0: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
7de0: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
7df0: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
7e00: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
7e10: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
7e20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7e30: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
7e40: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
7e50: 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f   u32 iDataVersio
7e60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
7e70: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
7e80: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
7e90: 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63  t changes */.  c
7ea0: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
7eb0: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
7ec0: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
7ed0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
7ee0: 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  nges */..  int n
7ef0: 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20  MmapOut;        
7f00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7f10: 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63   of mmap pages c
7f20: 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e  urrently outstan
7f30: 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ding */.  sqlite
7f40: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20  3_int64 szMmap; 
7f50: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64        /* Desired
7f60: 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69   maximum mmap si
7f70: 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ze */.  PgHdr *p
7f80: 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20  MmapFreelist;   
7f90: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
7fa0: 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65  ree mmap page he
7fb0: 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a  aders (pDirty) *
7fc0: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
7fd0: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
7fe0: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
7ff0: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
8050: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
8060: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
8070: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
8080: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
8090: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
80a0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
80b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
80c0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
80d0: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
80e0: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
80f0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
8100: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
8110: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
8120: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
8130: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
8140: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
8150: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
8160: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
8170: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8190: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
81a0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
81b0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
81d0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
81e0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
81f0: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
8200: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
8210: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
8220: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
8230: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
8240: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
8250: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
8260: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8270: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
8280: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
8290: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
82a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
82b0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
82c0: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
82d0: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
82e0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
82f0: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
8300: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
8310: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
8320: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
8330: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
8340: 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33  */.  int aStat[3
8350: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
8360: 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20   /* Total cache 
8370: 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64  hits, misses and
8380: 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65   writes */.#ifde
8390: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
83a0: 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20  int nRead;      
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
83c0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
83d0: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  ad */.#endif.  v
83e0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
83f0: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
8400: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
8410: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
8420: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
8430: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
8440: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
8450: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
8460: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
8470: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
8480: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
8490: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
84a0: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
84b0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
84c0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
84d0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
84e0: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
84f0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
8500: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
8510: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
8520: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8540: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
8550: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
8560: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
8570: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
8580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8590: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
85a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
85b0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43   tmp use */.  PC
85c0: 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20  ache *pPCache;  
85d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
85e0: 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63  nter to page cac
85f0: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66  he object */.#if
8600: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8610: 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c  _WAL.  Wal *pWal
8620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8630: 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61     /* Write-ahea
8640: 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a  d log used by "j
8650: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22  ournal_mode=wal"
8660: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c   */.  char *zWal
8670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8680: 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66    /* File name f
8690: 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  or write-ahead l
86a0: 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  og */.#endif.};.
86b0: 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66  ./*.** Indexes f
86c0: 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65  or use with Page
86d0: 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50  r.aStat[]. The P
86e0: 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72  ager.aStat[] arr
86f0: 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ay contains.** t
8700: 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73  he values access
8710: 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51  ed by passing SQ
8720: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
8730: 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d  CHE_HIT, CACHE_M
8740: 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45  ISS .** or CACHE
8750: 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65  _WRITE to sqlite
8760: 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a  3_db_status()..*
8770: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
8780: 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65  STAT_HIT   0.#de
8790: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
87a0: 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20  MISS  1.#define 
87b0: 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
87c0: 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   2../*.** The fo
87d0: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
87e0: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
87f0: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
8800: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
8810: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
8820: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
8830: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
8840: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
8850: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
8860: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
8870: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
8880: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
8890: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
88a0: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
88b0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
88c0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
88d0: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
88e0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88f0: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
8900: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
8910: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
8920: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
8930: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8940: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
8950: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8960: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
8970: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
8980: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8990: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
89a0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
89b0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
89c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
89d0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
89e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
89f0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
8a00: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
8a10: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
8a20: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
8a30: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
8a40: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
8a50: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
8a60: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
8a70: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
8a80: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
8a90: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
8aa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
8ab0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
8ac0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
8ad0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  nal is being.** 
8ae0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
8af0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
8b00: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
8b10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
8b20: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
8b30: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
8b40: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
8b50: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
8b60: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
8b70: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
8b80: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
8b90: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
8ba0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
8bb0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
8bc0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
8bd0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
8be0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
8bf0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
8c00: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
8c10: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
8c20: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
8c30: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
8c40: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
8c50: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
8c60: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
8c70: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
8c80: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
8c90: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
8ca0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
8cb0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
8cc0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
8cd0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
8ce0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
8cf0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
8d00: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
8d10: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
8d20: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
8d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
8d40: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
8d50: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
8d60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
8d70: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
8d80: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
8d90: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
8da0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
8db0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
8dc0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
8dd0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
8de0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
8df0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
8e00: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
8e10: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
8e20: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
8e30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
8e40: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
8e50: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
8e60: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
8e70: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
8e80: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
8e90: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
8ea0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
8eb0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
8ec0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
8ed0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
8ee0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
8ef0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
8f00: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
8f10: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
8f20: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
8f30: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
8f40: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
8f50: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65   of each page re
8f60: 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  cord in the jour
8f70: 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a  nal is given by.
8f80: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
8f90: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69   macro..*/.#defi
8fa0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
8fb0: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
8fc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
8fd0: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
8fe0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
8ff0: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
9000: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
9010: 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73  y the same .** s
9020: 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ize as a single 
9030: 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65  disk sector. See
9040: 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53   also setSectorS
9050: 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ize()..*/.#defin
9060: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
9070: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
9080: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
9090: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
90a0: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
90b0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
90c0: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
90d0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
90e0: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
90f0: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
9100: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
9110: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
9120: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
9130: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
9140: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
9150: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
9160: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
9170: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
9180: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
9190: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
91a0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
91b0: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
91c0: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
91d0: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
91e0: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
91f0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55  *.** The macro U
9200: 53 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20  SEFETCH is true 
9210: 69 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65  if we are allowe
9220: 64 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65  d to use the xFe
9230: 74 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68  tch and xUnfetch
9240: 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74  .** interfaces t
9250: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
9260: 61 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f  abase using memo
9270: 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a  ry-mapped I/O..*
9280: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
9290: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64  _MMAP_SIZE>0.# d
92a0: 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78  efine USEFETCH(x
92b0: 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63  ) ((x)->bUseFetc
92c0: 68 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  h).#else.# defin
92d0: 65 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a  e USEFETCH(x) 0.
92e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
92f0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
9300: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
9310: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
9320: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
9330: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
9340: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
9350: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
9360: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
9370: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
9380: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
9390: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
93a0: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
93b0: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
93c0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
93d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
93e0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
93f0: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
9400: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
9410: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
9420: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
9430: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
9440: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
9450: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
9460: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
9470: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
9480: 29 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a  )->pMethods!=0).
9490: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
94a0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
94b0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
94c0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
94d0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
94e0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
94f0: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
9500: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
9510: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
9520: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
9530: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
9540: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
9550: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
9560: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9570: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9580: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9590: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
95a0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95b0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
95c0: 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  y) 0.# define pa
95d0: 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
95e0: 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ent(z) SQLITE_OK
95f0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42  .# define pagerB
9600: 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
9610: 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ion(z) SQLITE_OK
9620: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9630: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
9640: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
9650: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
9660: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
9670: 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66   );.**.** This f
9680: 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e  unction runs man
9690: 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79  y asserts to try
96a0: 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69   to find inconsi
96b0: 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74  stencies in.** t
96c0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
96d0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
96e0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
96f0: 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65   int assert_page
9700: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
9710: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
9720: 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74  er = p;..  /* St
9730: 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ate must be vali
9740: 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  d. */.  assert( 
9750: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9760: 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20  _OPEN.       || 
9770: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9780: 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c  _READER.       |
9790: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
97a0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
97b0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
97c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
97d0: 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
97e0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
97f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
9800: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9810: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9820: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20  RITER_FINISHED. 
9830: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9840: 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
9850: 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72    );..  /* Regar
9860: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72  dless of the cur
9870: 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65  rent state, a te
9880: 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69  mp-file connecti
9890: 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65  on always behave
98a0: 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20  s.  ** as if it 
98b0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
98c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
98d0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e  abase file. It n
98e0: 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a  ever updates.  *
98f0: 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  * the change-cou
9900: 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74  nter field, so t
9910: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
9920: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
9930: 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s set..  */.  as
9940: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9950: 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b  e==0 || p->eLock
9960: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9970: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9980: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9990: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
99a0: 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a  untDone );..  /*
99b0: 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e   If the useJourn
99c0: 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  al flag is clear
99d0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  , the journal-mo
99e0: 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22  de must be "OFF"
99f0: 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74  . .  ** And if t
9a00: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9a10: 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f  is "OFF", the jo
9a20: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9a30: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a  not be open..  *
9a40: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  /.  assert( p->j
9a50: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9a60: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9a70: 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e  F || p->useJourn
9a80: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
9a90: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  p->journalMode!=
9aa0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9ab0: 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e  E_OFF || !isOpen
9ac0: 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  (p->jfd) );..  /
9ad0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d  * Check that MEM
9ae0: 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e  DB implies noSyn
9af0: 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d  c. And an in-mem
9b00: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e  ory journal. Sin
9b10: 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65  ce .  ** this me
9b20: 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ans an in-memory
9b30: 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20   pager performs 
9b40: 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74  no IO at all, it
9b50: 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65   cannot encounte
9b60: 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53  r .  ** either S
9b70: 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
9b80: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e  QLITE_FULL durin
9b90: 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68  g rollback or wh
9ba0: 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a  ile finalizing .
9bb0: 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66    ** a journal f
9bc0: 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74  ile. (although t
9bd0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  he in-memory jou
9be0: 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rnal implementat
9bf0: 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65  ion may .  ** re
9c00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
9c10: 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68  R_NOMEM while th
9c20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9c30: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29  s being written)
9c40: 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  . It .  ** is th
9c50: 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73  erefore not poss
9c60: 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ible for an in-m
9c70: 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65  emory pager to e
9c80: 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a  nter the ERROR .
9c90: 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f    ** state..  */
9ca0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
9cb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9cc0: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
9cd0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9ce0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9cf0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9d00: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9d10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9d20: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9d30: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
9d40: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
9d50: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
9d60: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
9d70: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
9d80: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
9d90: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
9da0: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
9db0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
9dc0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
9dd0: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
9de0: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
9df0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
9e00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
9e10: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
9e20: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
9e30: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9e40: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9e50: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
9e60: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
9e70: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
9e80: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
9e90: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
9ea0: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
9eb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9ec0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9ed0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9ee0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9ef0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
9f00: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
9f10: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
9f20: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
9f30: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9f40: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
9f50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9f60: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9f70: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9f80: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9f90: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9fa0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9fb0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
9fc0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
9fd0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9fe0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9ff0: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
a000: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a010: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a020: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a030: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a040: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a050: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a060: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a070: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a080: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a090: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
a0a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0b0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
a0c0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
a0d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a0e0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a0f0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a100: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a110: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a120: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a130: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a140: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a150: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a160: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a170: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a180: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a190: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a1a0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a1b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a1c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a1d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a1e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a1f0: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a200: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a210: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a220: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a230: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a240: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a250: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a260: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a270: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a280: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a290: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a2a0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a2b0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a2c0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a2d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a2e0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a2f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a300: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a320: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a330: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a340: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a350: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a360: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a370: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a380: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a390: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a3a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a3b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a3c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a3e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a3f0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a400: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a420: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a430: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a440: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a450: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a460: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a470: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
a480: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a490: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a4a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a4b0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a4c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a4d0: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a4e0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a4f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a500: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
a510: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a520: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a530: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a540: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a550: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a560: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a570: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a580: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a590: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a5a0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a5b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a5c0: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
a5d0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a5e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a5f0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a600: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
a610: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a620: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a630: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a640: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a650: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a660: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a670: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a680: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a690: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a6a0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a6b0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a6c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a6d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a6e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a6f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a700: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a710: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a720: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a730: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
a740: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
a750: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a760: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
a770: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
a780: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
a790: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
a7a0: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
a7b0: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
a7c0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
a7d0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
a7e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
a7f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a800: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a810: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
a820: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a830: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
a840: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
a850: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
a860: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a870: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  }..  return 1;.}
a880: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
a890: 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  f NDEBUG */..#if
a8a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a8b0: 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61   ./*.** Return a
a8c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75   pointer to a hu
a8d0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
a8e0: 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20  ing in a static 
a8f0: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
a900: 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f  ning the state o
a910: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
a920: 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  ct passed as an 
a930: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  argument. This.*
a940: 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  * is intended to
a950: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
a960: 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65  debuggers. For e
a970: 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c  xample, as an al
a980: 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20  ternative.** to 
a990: 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20  "print *pPager" 
a9a0: 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67  in gdb:.**.** (g
a9b0: 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c  db) printf "%s",
a9c0: 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61   print_pager_sta
a9d0: 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74  te(pPager).*/.st
a9e0: 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74  atic char *print
a9f0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
aa00: 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63  er *p){.  static
aa10: 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d   char zRet[1024]
aa20: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
aa30: 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74  rintf(1024, zRet
aa40: 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d  ,.      "Filenam
aa50: 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20  e:      %s\n".  
aa60: 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20      "State:     
aa70: 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25      %s errCode=%
aa80: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  d\n".      "Lock
aa90: 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22  :          %s\n"
aaa0: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20  .      "Locking 
aab0: 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d  mode:  locking_m
aac0: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
aad0: 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20  "Journal mode:  
aae0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c  journal_mode=%s\
aaf0: 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e  n".      "Backin
ab00: 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c  g store: tempFil
ab10: 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73  e=%d memDb=%d us
ab20: 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20  eJournal=%d\n". 
ab30: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20       "Journal:  
ab40: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d       journalOff=
ab50: 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d  %lld journalHdr=
ab60: 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53  %lld\n".      "S
ab70: 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62  ize:          db
ab80: 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69  size=%d dbOrigSi
ab90: 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65  ze=%d dbFileSize
aba0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70  =%d\n".      , p
abb0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20  ->zFilename.    
abc0: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
abd0: 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20  AGER_OPEN       
abe0: 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a       ? "OPEN" :.
abf0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ac00: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
ac10: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
ac20: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
ac30: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ac40: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f  RITER_LOCKED   ?
ac50: 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22   "WRITER_LOCKED"
ac60: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ac70: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ac80: 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57  ER_CACHEMOD ? "W
ac90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20  RITER_CACHEMOD" 
aca0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
acb0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
acc0: 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52  R_DBMOD    ? "WR
acd0: 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20  ITER_DBMOD" :.  
ace0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
acf0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
ad00: 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52  NISHED ? "WRITER
ad10: 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20  _FINISHED" :.   
ad20: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ad30: 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20  PAGER_ERROR     
ad40: 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20        ? "ERROR" 
ad50: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
ad60: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43    , (int)p->errC
ad70: 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ode.      , p->e
ad80: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20  Lock==NO_LOCK   
ad90: 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b        ? "NO_LOCK
ada0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
adb0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
adc0: 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45  OCK   ? "RESERVE
add0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ade0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
adf0: 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53  _LOCK  ? "EXCLUS
ae00: 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70  IVE" :.        p
ae10: 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
ae20: 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52  LOCK     ? "SHAR
ae30: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ae40: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
ae50: 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f  LOCK    ? "UNKNO
ae60: 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  WN" : "?error?".
ae70: 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75        , p->exclu
ae80: 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c  siveMode ? "excl
ae90: 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c  usive" : "normal
aea0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  ".      , p->jou
aeb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
aec0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
aed0: 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20  RY   ? "memory" 
aee0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
aef0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
af10: 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20       ? "off" :. 
af20: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
af30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
af40: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
af50: 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20    ? "delete" :. 
af60: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
af70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
af80: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
af90: 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a    ? "persist" :.
afa0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
afb0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
afc0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
afd0: 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20  TE ? "truncate" 
afe0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
aff0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b000: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
b010: 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22       ? "wal" : "
b020: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
b030: 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c   (int)p->tempFil
b040: 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62  e, (int)p->memDb
b050: 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75  , (int)p->useJou
b060: 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e  rnal.      , p->
b070: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a  journalOff, p->j
b080: 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
b090: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65  , (int)p->dbSize
b0a0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67  , (int)p->dbOrig
b0b0: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
b0c0: 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20  FileSize.  );.. 
b0d0: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
b0e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
b0f0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
b100: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
b110: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
b120: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b130: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
b140: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
b150: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
b160: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
b170: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
b180: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
b190: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
b1a0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
b1b0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b1c0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
b1d0: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
b1e0: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
b1f0: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
b200: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
b210: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
b220: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
b230: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
b240: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
b250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b260: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
b270: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
b280: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
b290: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
b2a0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
b2b0: 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
b2c0: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74  pPg->pgno;.  int
b2d0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b2e0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
b2f0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  int; i++){.    p
b300: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
b310: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
b320: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
b330: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
b340: 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c  itvecTestNotNull
b350: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
b360: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
b370: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
b380: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
b390: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
b3a0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
b3b0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
b3c0: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
b3d0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b3e0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
b3f0: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
b400: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
b410: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
b420: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
b430: 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
b440: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
b450: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69  ->pgno);.}.#endi
b460: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
b470: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b480: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b490: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b4a0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b4b0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b4c0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b4d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b4e0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b4f0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b500: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b510: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b520: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b530: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b540: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b550: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b560: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b570: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b580: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b590: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b5a0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b5b0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b5c0: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b5d0: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b5e0: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b5f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b600: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b610: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b620: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b630: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b640: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b650: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b660: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b670: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b680: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b690: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b6a0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b6b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b6c0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b6d0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b6e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b6f0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b700: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b710: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b720: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b730: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b740: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b750: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b760: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b770: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b780: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b790: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b7a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b7b0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b7c0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b7d0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b7e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b7f0: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b800: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b810: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b820: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b830: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b840: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b850: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b860: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b870: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b880: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b890: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b8a0: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b8b0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b8c0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b8d0: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b8e0: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b8f0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b900: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b910: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b920: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b930: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b940: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b950: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b960: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b970: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b980: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b990: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b9a0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b9b0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b9c0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b9d0: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b9e0: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b9f0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
ba00: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
ba10: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ba20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
ba30: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
ba40: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
ba50: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
ba60: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
ba70: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
ba80: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
ba90: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
baa0: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
bab0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
bac0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
bad0: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bae0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
baf0: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
bb00: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
bb10: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
bb20: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
bb30: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
bb40: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
bb50: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
bb60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
bb70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
bb80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bb90: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
bba0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
bbb0: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
bbc0: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
bbd0: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
bbe0: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
bbf0: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
bc00: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
bc10: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
bc20: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
bc30: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
bc40: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
bc50: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
bc60: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
bc70: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
bc80: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
bc90: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
bca0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
bcb0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bcc0: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
bcd0: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
bce0: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
bcf0: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
bd00: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
bd10: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
bd20: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
bd30: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
bd40: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
bd50: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
bd60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bd70: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
bd80: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
bd90: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
bda0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
bdb0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bdc0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bdd0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
bde0: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
bdf0: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
be00: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
be10: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
be20: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
be30: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
be40: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
be50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
be60: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
be70: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
be80: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
be90: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
bea0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
beb0: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
bec0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
bed0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
bee0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
bef0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bf00: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
bf10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
bf20: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
bf30: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
bf40: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
bf50: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
bf60: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
bf70: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
bf80: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
bf90: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
bfa0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bfb0: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
bfc0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
bfd0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
bfe0: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
bff0: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
c000: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
c010: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
c020: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c030: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
c040: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
c050: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
c060: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
c070: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
c080: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
c090: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
c0a0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
c0b0: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
c0c0: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
c0d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
c0e0: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
c0f0: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
c100: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
c110: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
c120: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c130: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c140: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c150: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c160: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c170: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c180: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c190: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c1a0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c1b0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c1c0: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c1d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c1e0: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c1f0: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c200: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c210: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c220: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c230: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c240: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c250: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c280: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c290: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c2c0: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c2d0: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c2f0: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c300: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c310: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c320: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c330: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c340: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c350: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c360: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c370: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c380: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c390: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c3a0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c3b0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c3c0: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c3d0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c3e0: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c3f0: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c400: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c410: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c420: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c430: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c440: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c450: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c460: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c470: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c480: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c490: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c4a0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
c4b0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
c4c0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
c4d0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c4e0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
c4f0: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
c500: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
c510: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c520: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
c530: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
c540: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c550: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
c560: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
c570: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
c580: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
c590: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c5a0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
c5b0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
c5c0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
c5d0: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
c5e0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c5f0: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
c600: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
c610: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
c620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
c630: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
c640: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
c650: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c660: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
c670: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
c680: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c690: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
c6a0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
c6b0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
c6c0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c6d0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c6e0: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
c6f0: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c700: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
c710: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
c720: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
c730: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
c740: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
c750: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
c760: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
c770: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
c780: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c790: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
c7a0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
c7b0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
c7c0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
c7d0: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
c7e0: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
c7f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
c800: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
c810: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
c820: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
c830: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
c840: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
c850: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
c860: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
c870: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
c880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
c890: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
c8a0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
c8b0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
c8c0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
c8d0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
c8e0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
c8f0: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
c900: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
c910: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
c920: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
c930: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
c940: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
c950: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
c960: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
c970: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
c980: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
c990: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
c9a0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
c9b0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
c9c0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
c9d0: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
c9e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c9f0: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
ca00: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
ca10: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
ca20: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
ca30: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
ca40: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
ca50: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
ca60: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
ca70: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
ca80: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
ca90: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
caa0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
cab0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
cac0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
cad0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
cae0: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
caf0: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
cb00: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
cb10: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
cb20: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
cb30: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
cb40: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
cb50: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
cb60: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
cb70: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
cb80: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
cb90: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
cba0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
cbb0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
cbc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
cbd0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
cbe0: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
cbf0: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
cc00: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
cc10: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
cc20: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
cc30: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
cc40: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
cc50: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
cc60: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
cc70: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cc80: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
cc90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
cca0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
ccb0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
ccc0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
ccd0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
cce0: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
ccf0: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
cd00: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
cd10: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
cd20: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
cd30: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
cd40: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
cd50: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
cd60: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
cd70: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cd80: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
cd90: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
cda0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
cdb0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
cdc0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
cdd0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
cde0: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
cdf0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
ce00: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
ce10: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
ce20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
ce30: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
ce40: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
ce50: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
ce60: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
ce70: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
cea0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cec0: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
ced0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
cee0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
cef0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
cf00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
cf10: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
cf20: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
cf30: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
cf40: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
cf50: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
cf60: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
cf70: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
cf80: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cfa0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
cfb0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
cfc0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
cfd0: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
cfe0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
cff0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
d000: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
d010: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
d020: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d030: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
d040: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
d050: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
d060: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d070: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d080: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
d090: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
d0a0: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30  er .   || len==0
d0b0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
d0c0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
d0d0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
d0e0: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
d0f0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d100: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d110: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
d120: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
d130: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
d140: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
d150: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d160: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d170: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
d180: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
d190: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
d1a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d1b0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
d1c0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
d1d0: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
d1e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
d1f0: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
d200: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
d210: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
d220: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
d230: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
d240: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
d250: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
d260: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
d270: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
d280: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
d290: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d2a0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
d2b0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
d2c0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
d2d0: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
d2e0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
d2f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
d300: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
d310: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d320: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
d330: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
d340: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
d350: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
d360: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d370: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
d380: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
d390: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
d3a0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
d3b0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
d3c0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
d3d0: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
d3e0: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
d3f0: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
d400: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
d410: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
d420: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
d430: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
d440: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
d450: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
d460: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
d470: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
d480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d4a0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d4c0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d530: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d540: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d550: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d560: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d570: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d580: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d590: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d5a0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d5b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d5c0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d5d0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d5e0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d5f0: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d600: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d610: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d620: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d630: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d640: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d650: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d660: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d670: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d680: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d690: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d6a0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d6b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d6c0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d6d0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d6e0: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d6f0: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d700: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d710: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d720: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d730: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d740: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d750: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d760: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d770: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d780: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d790: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d7a0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d7b0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d7c0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d7d0: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d7e0: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d7f0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d810: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d820: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d830: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d840: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d850: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d860: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d870: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d880: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d890: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d8a0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d8b0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d8c0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d8d0: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d8e0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d8f0: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d900: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d910: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d920: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d930: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d940: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d950: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d960: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d970: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d980: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d990: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d9a0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d9b0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d9c0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d9d0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d9e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d9f0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
da00: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
da10: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
da20: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
da30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
da40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
da50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
da60: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
da70: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
da80: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
da90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
daa0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
dad0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
dae0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
daf0: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
db00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
db10: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
db20: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
db30: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
db40: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
db50: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
db60: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
db70: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
db80: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
db90: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
dba0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
dbb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
dbc0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
dbd0: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
dbe0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
dbf0: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
dc00: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
dc10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dc20: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
dc30: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
dc40: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
dc50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
dc60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
dc70: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
dc80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
dc90: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
dca0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
dcb0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
dcc0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
dcd0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
dce0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
dcf0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
dd00: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
dd10: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
dd20: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
dd30: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
dd40: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
dd50: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
dd60: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
dd70: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
dd80: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
dd90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
dda0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
ddb0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
ddc0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
ddd0: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
dde0: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
ddf0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
de00: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
de10: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
de20: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
de30: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
de40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
de50: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
de60: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
de70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
de80: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
de90: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
dea0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
deb0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
dec0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
ded0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
dee0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
def0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
df00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
df10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
df20: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
df30: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
df40: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
df50: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
df60: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
df70: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
df80: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
df90: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
dfa0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
dfb0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
dfc0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
dfd0: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
dfe0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
dff0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
e000: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
e010: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
e020: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
e030: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
e040: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
e050: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
e060: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
e070: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e080: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
e090: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
e0a0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e0b0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
e0c0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e0d0: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e0e0: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e0f0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e100: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e110: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e120: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e130: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e140: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e150: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e160: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e170: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e180: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e190: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e1a0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e1b0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e1d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e1e0: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e1f0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e200: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e210: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e220: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e230: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e240: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e250: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e260: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e270: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e280: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e2b0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e2c0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e2d0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e2f0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e300: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e310: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e320: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e330: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e340: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e350: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e360: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e370: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e380: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e390: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e3a0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e3b0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e3c0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e3d0: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e3e0: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e3f0: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e400: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e410: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e420: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e430: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e440: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
e450: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
e460: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
e470: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
e480: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
e490: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
e4a0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
e4b0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
e4c0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e4d0: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e4e0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e4f0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e500: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e510: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e520: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e530: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e540: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e550: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e560: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e570: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e580: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e590: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e5a0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e5b0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e5c0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e5d0: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e5e0: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e5f0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e600: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e610: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e620: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e630: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e640: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e650: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e660: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e670: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e680: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e690: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e6a0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e6b0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e6c0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e6d0: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e6e0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e6f0: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e700: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e710: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e720: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e730: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e740: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e750: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e760: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e770: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e780: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e790: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e7a0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e7b0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e7c0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e7d0: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e7e0: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e7f0: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e800: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e810: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e820: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e830: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e840: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e850: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e860: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e870: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e880: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e890: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e8a0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e8b0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e8c0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e8d0: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e8e0: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e8f0: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e900: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e910: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e920: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e930: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e940: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e950: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e960: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e970: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e980: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e990: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e9a0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e9b0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e9c0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e9d0: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e9e0: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e9f0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
ea00: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
ea10: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
ea20: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
ea30: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
ea40: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ea50: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
ea60: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
ea70: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
ea80: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
ea90: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
eaa0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
eab0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
eac0: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
ead0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
eae0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
eaf0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
eb00: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
eb10: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
eb20: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eb30: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb40: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
eb50: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
eb60: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
eb70: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
eb80: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
eb90: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
eba0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
ebb0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
ebc0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
ebd0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
ebe0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
ebf0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
ec00: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ec10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
ec20: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
ec30: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
ec40: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
ec50: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ec60: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ec70: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
ec80: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
ec90: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
eca0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
ecb0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
ecc0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
ecd0: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
ece0: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
ecf0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
ed00: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
ed10: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
ed20: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
ed30: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
ed40: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
ed50: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
ed60: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
ed70: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
ed80: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
ed90: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
eda0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
edb0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
edc0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
edd0: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
ede0: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
edf0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
ee00: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
ee10: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
ee20: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
ee30: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
ee40: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
ee50: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
ee60: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
ee70: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
ee80: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
ee90: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
eea0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
eeb0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
eec0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
eed0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
eee0: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
eef0: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
ef00: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
ef10: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
ef20: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
ef30: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
ef40: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
ef50: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
ef60: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
ef70: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
ef80: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
ef90: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
efa0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
efb0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
efc0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
efd0: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
efe0: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
eff0: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
f000: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
f010: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
f020: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
f030: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
f040: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
f050: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
f060: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
f070: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
f080: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
f090: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
f0a0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
f0b0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
f0c0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f0d0: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f0e0: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f0f0: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f100: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f110: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f120: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f130: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f140: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f150: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f160: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f170: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f180: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f190: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f1a0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f1b0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f1c0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f1d0: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f1e0: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f1f0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f200: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f210: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f220: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f230: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f240: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f250: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f260: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f270: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f280: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f290: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f2a0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f2b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f2c0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f2d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f2e0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f2f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f300: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f310: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f320: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f330: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f340: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f350: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f360: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f370: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f380: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f390: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f3a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f3b0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f3c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f3d0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f3e0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f3f0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f400: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f410: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f420: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f430: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f440: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
f450: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
f460: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
f470: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
f480: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
f490: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
f4a0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
f4b0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
f4c0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f4d0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f4e0: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f4f0: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f500: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f510: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f520: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f530: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f540: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f550: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f560: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f570: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f580: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f590: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f5a0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f5b0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f5c0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f5d0: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f5e0: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f5f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f600: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f610: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f620: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f630: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f640: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f650: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f660: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f670: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f680: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f690: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f6a0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f6b0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f6c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f6d0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f6e0: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f6f0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f710: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f720: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f730: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f740: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f750: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f760: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f770: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f780: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f790: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f7a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f7b0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f7c0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f7d0: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f7e0: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f7f0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f800: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f820: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f830: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f840: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f850: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f860: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f870: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f880: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f890: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f8a0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f8b0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f8c0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f8d0: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f8e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f8f0: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f900: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f910: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f920: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f930: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f940: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f950: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f960: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f970: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f980: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f990: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f9a0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f9b0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f9c0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f9d0: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f9e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f9f0: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
fa00: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
fa10: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
fa20: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
fa30: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
fa40: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
fa50: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
fa60: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
fa70: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
fa80: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
fa90: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
faa0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
fab0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
fac0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
fad0: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
fae0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
faf0: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
fb00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fb10: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
fb20: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
fb30: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
fb40: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
fb50: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
fb60: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
fb70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fb80: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
fb90: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
fba0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
fbb0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
fbc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fbd0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fbe0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
fbf0: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
fc00: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
fc10: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
fc20: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
fc30: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
fc40: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
fc50: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
fc60: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
fc70: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
fc80: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
fc90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
fca0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
fcb0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
fcc0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fcd0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fce0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fcf0: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
fd00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fd10: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fd20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fd30: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
fd40: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
fd50: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fd60: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fd70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fd80: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
fd90: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
fda0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
fdb0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
fdc0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
fdd0: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fdf0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
fe00: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fe10: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
fe20: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
fe30: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
fe40: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
fe50: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
fe60: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
fe70: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fe80: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
fe90: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
fea0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
feb0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fec0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fed0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
fee0: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
fef0: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
ff00: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
ff10: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
ff20: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
ff30: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
ff40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
ff50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ff60: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
ff70: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
ff80: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
ff90: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
ffa0: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
ffb0: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
ffc0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
ffd0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
ffe0: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
fff0: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
10000 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
10010 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
10020 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
10030 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
10040 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
10050 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
10060 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
10070 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
10080 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
10090 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
100a0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
100b0 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
100c0 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
100d0 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
100e0 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
100f0 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
10100 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
10110 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
10120 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
10130 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
10140 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10150 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10160 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
10170 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
10180 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10190 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
101c0 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
101d0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
101e0 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
101f0 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
10200 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
10210 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
10220 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
10230 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
10240 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10250 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10260 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
10270 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
10280 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
10290 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
102a0 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
102b0 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
102c0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
102d0 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
102e0 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
102f0 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
10300 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
10310 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
10320 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
10330 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
10340 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10350 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10360 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10380 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
10390 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
103a0 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
103b0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
103c0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
103d0 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
103e0 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
103f0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10400 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
10410 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
10420 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10430 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10440 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10450 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10460 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
10470 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
10480 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
10490 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
104a0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
104b0 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
104c0 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
104d0 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
104e0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
104f0 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10500 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10510 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10520 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10530 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10540 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10550 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10560 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
10570 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
10580 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
10590 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
105a0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
105b0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
105c0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
105d0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
105e0 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
105f0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10600 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10610 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10620 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10630 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10640 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10660 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
10670 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
10680 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
10690 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
106a0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
106b0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
106c0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
106d0 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
106e0 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
106f0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10700 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10710 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10720 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10730 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10740 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10750 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10760 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
10770 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
10780 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
10790 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
107a0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
107b0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
107c0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
107d0 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
107e0 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
107f0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10800 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10810 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10820 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10830 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10840 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10850 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10860 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
10870 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
10880 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
10890 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
108a0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
108b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
108c0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
108d0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
108e0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
108f0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10900 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10910 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10920 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10930 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10940 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10950 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10960 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
10970 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
10980 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
10990 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
109a0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
109b0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
109c0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
109d0 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
109e0 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
109f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a10 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10a20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10a40 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10a50 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10a60 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
10a70 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
10a80 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10a90 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
10aa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
10ab0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10ae0 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10af0 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10b00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10b10 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10b20 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10b30 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10b40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10b50 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10b60 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10b70 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
10b80 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
10b90 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
10ba0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
10bb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
10bc0 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
10bd0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
10be0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10c00 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10c10 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
10c20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10c30 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
10c40 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
10c50 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
10c60 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
10c70 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
10c80 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10c90 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10ca0 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10cb0 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10cc0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10cd0 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10ce0 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10cf0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10d00 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10d10 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10d20 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10d30 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10d40 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10d50 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10d60 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10d70 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10d80 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10d90 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10da0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10db0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10dc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10dd0 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10de0 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10df0 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10e00 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10e10 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10e20 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10e30 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10e40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10e50 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10e60 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10e70 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10e80 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10e90 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10ea0 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10eb0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10ec0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10ed0 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10ee0 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10ef0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10f00 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10f10 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10f20 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10f30 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10f40 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10f50 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10f60 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10f70 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10f80 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10f90 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10fa0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10fb0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10fc0 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10fd0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10fe0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10ff0 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
11000 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
11010 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
11020 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
11030 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
11040 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
11050 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
11060 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
11070 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
11080 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
11090 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
110a0 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
110b0 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
110c0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
110d0 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
110e0 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
110f0 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
11100 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
11110 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
11120 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
11130 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
11140 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
11150 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
11160 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
11170 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
11180 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
11190 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
111a0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
111b0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
111c0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
111d0 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
111e0 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
111f0 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
11200 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
11210 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
11220 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
11230 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
11240 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
11250 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
11260 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11270 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
11280 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
11290 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
112a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
112b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
112c0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
112d0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
112e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
112f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11300 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
11310 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
11320 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
11330 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65 2e  mory page-cache.
11340 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11350 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
11360 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50  r *pPager){.  pP
11370 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
11380 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 42  on++;.  sqlite3B
11390 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
113a0 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
113b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
113c0 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
113d0 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
113e0 65 74 75 72 6e 20 74 68 65 20 70 50 61 67 65 72  eturn the pPager
113f0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 20 76  ->iDataVersion v
11400 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  alue.*/.u32 sqli
11410 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72 73  te3PagerDataVers
11420 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
11430 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r){.  assert( pP
11440 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
11450 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74  ER_OPEN );.  ret
11460 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74  urn pPager->iDat
11470 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a  aVersion;.}../*.
11480 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75  ** Free all stru
11490 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61  ctures in the Pa
114a0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d  ger.aSavepoint[]
114b0 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62   array and set b
114c0 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61  oth.** Pager.aSa
114d0 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65  vepoint and Page
114e0 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20  r.nSavepoint to 
114f0 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20  zero. Close the 
11500 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  sub-journal.** i
11510 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64  f it is open and
11520 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
11530 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
11540 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
11550 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  oid releaseAllSa
11560 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a  vepoints(Pager *
11570 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69  pPager){.  int i
11580 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11590 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
115a0 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
115b0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
115c0 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b  t */.  for(ii=0;
115d0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
115e0 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
115f0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
11600 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
11610 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
11620 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
11630 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
11640 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
11650 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  | sqlite3IsMemJo
11660 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a  urnal(pPager->sj
11670 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fd) ){.    sqlit
11680 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11690 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->sjfd);.  }.  s
116a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
116b0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b  er->aSavepoint);
116c0 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  .  pPager->aSave
116d0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
116e0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
116f0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
11700 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  SubRec = 0;.}../
11710 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74  *.** Set the bit
11720 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
11730 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
11740 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
11750 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61  .** bitvecs of a
11760 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
11770 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ts. Return SQLIT
11780 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
11790 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ul.** or SQLITE_
117a0 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
117b0 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
117c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
117d0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
117e0 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
117f0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
11800 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11820 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
11830 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11840 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
11850 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
11860 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
11870 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
11880 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
11890 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
118a0 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
118b0 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
118c0 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
118d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
118e0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
118f0 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
11900 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74  , pgno);.      t
11910 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
11920 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
11930 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
11940 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
11950 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
11960 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11970 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11980 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11990 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
119a0 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
119b0 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e  usive mode and n
119c0 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52  ot.** in the ERR
119d0 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
119e0 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73  ise, it switches
119f0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41   the pager to PA
11a00 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74  GER_OPEN.** stat
11a10 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
11a20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11a30 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
11a40 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62   mode, the datab
11a50 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  ase file is.** c
11a60 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b  ompletely unlock
11a70 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  ed. If the file 
11a80 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20  is unlocked and 
11a90 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11aa0 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69  does.** not exhi
11ab0 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41  bit the UNDELETA
11ac0 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72  BLE_WHEN_OPEN pr
11ad0 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72  operty, the jour
11ae0 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  nal file is.** c
11af0 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20  losed (if it is 
11b00 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  open)..**.** If 
11b10 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11b20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
11b30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11b40 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a  s called, the .*
11b50 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
11b60 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72  e pager cache ar
11b70 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f  e discarded befo
11b80 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63  re switching bac
11b90 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45  k to .** the OPE
11ba0 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c  N state. Regardl
11bb0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
11bc0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
11bd0 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a  xclusive-mode.**
11be0 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75   or not, any jou
11bf0 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69  rnal file left i
11c00 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
11c10 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65  m will be treate
11c20 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f  d.** as a hot-jo
11c30 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
11c40 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74   back the next t
11c50 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73  ime a read-trans
11c60 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65  action.** is ope
11c70 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20  ned (by this or 
11c80 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e  by any other con
11c90 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61  nection)..*/.sta
11ca0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
11cb0 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
11cc0 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  ger){..  assert(
11cd0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11ce0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
11cf0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
11d00 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
11d10 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  PEN .       || p
11d20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11d30 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b  AGER_ERROR .  );
11d40 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
11d50 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11d60 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
11d70 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11d80 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  al = 0;.  releas
11d90 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
11da0 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
11db0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
11dc0 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
11dd0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
11de0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71  ->jfd) );.    sq
11df0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
11e00 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
11e10 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50  r->pWal);.    pP
11e20 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
11e30 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGER_OPEN;.  }el
11e40 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
11e50 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
11e60 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
11e90 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67   returned by pag
11ea0 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a  erUnlockDb() */.
11eb0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73      int iDc = is
11ec0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
11ed0 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  ?sqlite3OsDevice
11ee0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
11ef0 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a  pPager->fd):0;..
11f00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
11f10 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73  erating system s
11f20 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20  upport deletion 
11f30 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74  of open files, t
11f40 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65  hen.    ** close
11f50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11f60 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
11f70 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
11f80 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20  k.  Otherwise.  
11f90 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e    ** another con
11fa0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
11fb0 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
11fc0 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68   might delete th
11fd0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75  e file.    ** ou
11fe0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
11ff0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12000 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12010 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20  ALMODE_MEMORY   
12020 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
12030 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12040 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
12050 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12060 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12070 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
12080 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
12090 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
120a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
120b0 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31  DELETE   & 5)!=1
120c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
120d0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
120e0 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29  DE_TRUNCATE & 5)
120f0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
12100 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12110 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26  LMODE_PERSIST  &
12120 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66   5)==1 );.    if
12130 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49  ( 0==(iDc & SQLI
12140 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
12150 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a  ABLE_WHEN_OPEN).
12160 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67       || 1!=(pPag
12170 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
12180 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  & 5).    ){.    
12190 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
121a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
121b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
121c0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
121d0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
121e0 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  and the call to 
121f0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
12200 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
12210 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63  fails, set the c
12220 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55  urrent lock to U
12230 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
12240 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20   the comment.   
12250 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64   ** above the #d
12260 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57  efine for UNKNOW
12270 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
12280 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79  planation of why
12290 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   this.    ** is 
122a0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
122b0 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
122c0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
122d0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69   NO_LOCK);.    i
122e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
122f0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
12300 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
12310 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
12320 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e  >eLock = UNKNOWN
12330 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  _LOCK;.    }..  
12340 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73    /* The pager s
12350 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e  tate may be chan
12360 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45  ged from PAGER_E
12370 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50  RROR to PAGER_OP
12380 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77  EN here.    ** w
12390 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20  ithout clearing 
123a0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  the error code. 
123b0 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f  This is intentio
123c0 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a  nal - the error.
123d0 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63      ** code is c
123e0 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63  leared and the c
123f0 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68  ache reset in th
12400 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20  e block below.. 
12410 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
12420 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12430 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  e || pPager->eSt
12440 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
12450 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
12460 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12470 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
12480 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12490 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OPEN;.  }..  /* 
124a0 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
124b0 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
124c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
124d0 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
124e0 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  be.  ** trusted.
124f0 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20   Now that there 
12500 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
12510 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
12520 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a   the pager,.  **
12530 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d   it can safely m
12540 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ove back to PAGE
12550 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68  R_OPEN state. Th
12560 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f  is happens in bo
12570 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61  th.  ** normal a
12580 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  nd exclusive-loc
12590 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a  king mode..  */.
125a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
125b0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73  rCode ){.    ass
125c0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
125d0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
125e0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
125f0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12600 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
12610 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67  mpFile;.    pPag
12620 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12630 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61  ER_OPEN;.    pPa
12640 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
12650 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 66  QLITE_OK;.    if
12660 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
12670 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
12680 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
12690 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
126a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
126b0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
126c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
126d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
126e0 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aster = 0;.}../*
126f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12700 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
12710 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72  ever an IOERR or
12720 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74   FULL error that
12730 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65   requires.** the
12740 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69   pager to transi
12750 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52  tion into the ER
12760 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68  ROR state may ah
12770 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  ve occurred..** 
12780 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
12790 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
127a0 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
127b0 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
127c0 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  nd .** the error
127d0 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
127e0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
127f0 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
12800 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75  on. The .** valu
12810 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
12820 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
12830 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
12840 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
12850 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
12860 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
12870 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
12880 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
12890 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20  of the.** IOERR 
128a0 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70  sub-codes, the p
128b0 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20  ager enters the 
128c0 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
128d0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
128e0 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50  * is stored in P
128f0 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68  ager.errCode. Wh
12900 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65  ile the pager re
12910 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52  mains in the ERR
12920 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c  OR state,.** all
12930 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73   major API calls
12940 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69   on the Pager wi
12950 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
12960 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43  eturn Pager.errC
12970 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ode..**.** The E
12980 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63  RROR state indic
12990 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
129a0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
129b0 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
129c0 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
129d0 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
129e0 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
129f0 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
12a00 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
12a10 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12a20 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
12a30 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
12a40 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
12a50 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
12a60 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e  r occurred, then
12a70 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
12a80 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
12a90 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
12aa0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
12ab0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
12ad0 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20  s if.** it were 
12ae0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
12af0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
12b00 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
12b10 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
12b20 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
12b30 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
12b40 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
12b50 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
12b60 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
12b70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12b80 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
12b90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12ba0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
12bb0 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
12bc0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
12bd0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
12be0 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32  R.  );.  if( rc2
12bf0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12c00 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
12c10 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  RR ){.    pPager
12c20 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
12c30 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12c40 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52  te = PAGER_ERROR
12c50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12c60 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
12c70 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
12c80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
12c90 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a  gno nPage);../*.
12ca0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12cb0 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
12cc0 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
12cd0 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
12ce0 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
12cf0 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
12d00 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
12d10 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
12d20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
12d30 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
12d40 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
12d50 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
12d60 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
12d70 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
12d80 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
12d90 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
12da0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
12db0 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
12dc0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
12dd0 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
12de0 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
12df0 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45  alled in PAGER_E
12e00 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69  RROR state. If i
12e10 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69  t is called.** i
12e20 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20  n PAGER_NONE or 
12e30 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
12e40 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  te and the lock 
12e50 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20  held is less.** 
12e60 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61  exclusive than a
12e70 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
12e80 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
12e90 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
12ea0 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
12eb0 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
12ec0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
12ed0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
12ee0 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
12ef0 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
12f00 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
12f10 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
12f20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
12f30 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
12f40 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
12f50 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
12f60 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
12f70 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
12f80 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
12f90 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
12fa0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
12fb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12fc0 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
12fd0 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
12fe0 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
12ff0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
13000 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
13010 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
13020 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
13030 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
13040 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
13050 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
13060 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
13070 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13080 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
13090 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
130a0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
130b0 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
130c0 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
130d0 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
130e0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
130f0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
13100 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
13110 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
13120 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
13130 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
13140 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13150 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
13160 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
13170 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
13180 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
13190 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
131a0 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
131b0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
131c0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
131d0 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
131e0 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
131f0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
13200 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
13210 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
13220 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
13230 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13240 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
13250 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13260 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
13270 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
13280 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
13290 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
132a0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
132b0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
132c0 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
132d0 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
132e0 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
132f0 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
13300 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
13310 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
13320 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
13330 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
13340 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
13350 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
13360 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
13370 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
13380 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
13390 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
133a0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
133b0 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
133c0 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d  zed, the pager m
133d0 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45  oves to PAGER_RE
133e0 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49  ADER state..** I
133f0 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
13400 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62  -exclusive rollb
13410 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ack mode, the lo
13420 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  ck on the file i
13430 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64  s .** downgraded
13440 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43   to a SHARED_LOC
13450 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
13460 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
13470 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
13480 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
13490 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
134a0 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
134b0 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
134c0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
134d0 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
134e0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
134f0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
13500 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
13510 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
13520 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
13530 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
13540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13550 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
13560 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
13570 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
13580 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13590 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
135a0 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
135b0 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
135c0 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
135d0 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
135e0 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
135f0 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
13600 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
13610 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
13620 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13630 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
13640 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
13650 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
13660 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
13670 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13680 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62  hasMaster, int b
13690 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72  Commit){.  int r
136a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
136b0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
136c0 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
136d0 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
136e0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
136f0 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13700 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13710 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13720 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13730 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13740 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
13750 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
13760 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
13770 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
13780 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
13790 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
137a0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
137b0 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
137c0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
137d0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
137e0 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
137f0 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13800 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13810 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13820 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13830 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13840 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
13850 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
13860 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
13870 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
13880 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
13890 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
138a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
138b0 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
138c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
138d0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
138e0 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
138f0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13900 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13910 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13920 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13930 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13940 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
13950 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
13960 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
13970 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
13980 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
13990 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
139a0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
139b0 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
139c0 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
139d0 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
139e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
139f0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13a00 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13a10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13a20 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13a30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13a40 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
13a50 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
13a60 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
13a70 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
13a80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a90 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
13aa0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
13ab0 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
13ac0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13ad0 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13ae0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13af0 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13b00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13b20 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13b30 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13b40 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13b50 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
13b60 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
13b70 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
13b80 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
13b90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13ba0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13bb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
13bc0 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
13bd0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13be0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
13bf0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
13c00 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13c10 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
13c20 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
13c30 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13c40 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
13c50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13c60 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
13c70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13c80 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
13c90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
13ca0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
13cc0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
13cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
13ce0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
13cf0 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77  w file size is w
13d00 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
13d10 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61 79  inode right away
13d20 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  ..          ** O
13d30 74 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75  therwise the jou
13d40 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72  rnal might resur
13d50 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  rect following a
13d60 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a   power loss and.
13d70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75            ** cau
13d80 73 65 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e  se the last tran
13d90 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20  saction to roll 
13da0 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20  back.  See.     
13db0 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f       ** https://
13dc0 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61  bugzilla.mozilla
13dd0 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67  .org/show_bug.cg
13de0 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20  i?id=1072773.   
13df0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13e10 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
13e20 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
13e30 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
13e40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13e50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13e60 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
13e70 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13e80 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
13ea0 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70  SIST.      || (p
13eb0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13ec0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
13ed0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
13ee0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
13ef0 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  AL).    ){.     
13f00 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
13f10 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
13f20 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
13f30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13f40 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
13f50 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
13f60 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
13f70 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
13f80 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
13f90 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
13fa0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
13fb0 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
13fc0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
13fd0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
13fe0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
13ff0 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
14000 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
14010 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
14020 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
14030 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14040 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
14050 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
14060 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
14070 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
14080 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21 70 50  t bDelete = (!pP
14090 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
140a0 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  & sqlite3Journal
140b0 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 6a  Exists(pPager->j
140c0 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  fd));.      asse
140d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
140e0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
140f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
14100 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
14110 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14120 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14130 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
14140 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
14150 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14160 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14170 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
14180 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14190 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
141a0 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
141b0 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  bDelete ){.     
141c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
141d0 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
141e0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
141f0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
14200 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
14210 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
14220 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74  CK_PAGES.  sqlit
14230 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
14240 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
14250 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
14260 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28  pagehash);.  if(
14270 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
14280 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61  =0 && sqlite3Pca
14290 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
142a0 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
142b0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
142c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
142d0 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  kup(pPager, 1);.
142e0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
142f0 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d     p->pageHash =
14300 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
14310 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
14320 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ll(p);.    }.  }
14330 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
14340 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
14350 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
14360 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
14370 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
14380 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
14390 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
143a0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
143b0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73  r->pPCache);.  s
143c0 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
143d0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
143e0 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
143f0 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61  Size);..  if( pa
14400 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14410 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
14420 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
14430 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
14440 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
14450 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
14460 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
14470 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
14480 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
14490 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
144a0 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
144b0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
144c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
144d0 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
144e0 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
144f0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
14500 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
14510 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
14520 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65  TE_OK );.  }else
14530 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14540 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26  OK && bCommit &&
14550 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
14560 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  ize>pPager->dbSi
14570 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ze ){.    /* Thi
14580 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
14590 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  n when committin
145a0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
145b0 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  in rollback-jour
145c0 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  nal.    ** mode 
145d0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
145e0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
145f0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
14600 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
14610 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
14620 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  oint the journal
14630 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
14640 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e  zed and the tran
14650 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
14660 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
14670 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20  mitted, but the 
14680 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
14690 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
146a0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  the.    ** file.
146b0 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   So it is safe t
146c0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  o truncate the d
146d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
146e0 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  its minimum.    
146f0 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  ** required size
14700 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
14710 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
14720 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
14730 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
14740 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
14750 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
14760 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  e);.  }..  if( r
14770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14780 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65  bCommit && isOpe
14790 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
147a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
147b0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
147c0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
147d0 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50  E_FCNTL_COMMIT_P
147e0 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20  HASETWO, 0);.   
147f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14800 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
14810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14820 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
14830 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
14840 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61   && (!pagerUseWa
14850 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c  l(pPager) || sql
14860 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
14870 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
14880 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20  l, 0)).  ){.    
14890 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63  rc2 = pagerUnloc
148a0 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
148b0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
148c0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
148d0 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
148e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
148f0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
14900 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
14910 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
14920 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
14930 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
14940 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
14950 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
14960 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
14970 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
14980 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
14990 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
149a0 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
149b0 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
149c0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20  ERROR state, do 
149d0 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
149e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
149f0 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
14a00 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
14a10 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
14a20 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
14a30 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
14a40 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
14a50 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
14a60 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
14a70 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f  base file and mo
14a80 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63  ve the pager bac
14a90 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
14aa0 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61   If this .** mea
14ab0 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
14ac0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
14ad0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
14ae0 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
14af0 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
14b00 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
14b10 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
14b20 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
14b30 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a  be this one) .**
14b40 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61   will roll it ba
14b50 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
14b60 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
14b70 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
14b80 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
14b90 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
14ba0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
14bb0 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
14bc0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
14bd0 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
14be0 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
14bf0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
14c00 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68  ROR state. Which
14c10 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
14c20 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
14c30 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
14c40 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
14c50 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
14c60 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
14c70 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
14c80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14c90 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
14ca0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
14cb0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
14cc0 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  !=PAGER_OPEN ){.
14cd0 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
14ce0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
14cf0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66  Pager) );.    if
14d00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14d10 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
14d20 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73  OCKED ){.      s
14d30 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
14d40 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
14d50 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
14d60 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
14d70 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
14d80 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14d90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
14da0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14db0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ode ){.      ass
14dc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
14dd0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
14de0 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  R );.      pager
14df0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
14e00 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
14e10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
14e20 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
14e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
14e40 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
14e50 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
14e60 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
14e70 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
14e80 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
14e90 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
14ea0 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
14eb0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
14ec0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
14ed0 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
14ee0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
14ef0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
14f00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
14f10 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
14f20 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
14f30 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
14f40 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
14f50 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
14f60 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14f70 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
14f80 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
14f90 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
14fa0 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
14fb0 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
14fc0 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
14fd0 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
14fe0 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
14ff0 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
15000 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
15010 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
15020 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
15030 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
15040 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
15050 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
15060 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
15070 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
15080 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
15090 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
150a0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
150b0 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
150c0 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
150d0 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
150e0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
150f0 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
15100 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
15110 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
15120 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
15130 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
15140 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
15150 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
15160 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
15170 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
15180 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
15190 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
151a0 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
151b0 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
151c0 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
151d0 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
151e0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
151f0 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
15200 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
15210 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
15220 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
15230 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
15240 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
15250 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
15260 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
15270 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
15280 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
15290 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
152a0 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
152b0 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
152c0 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
152d0 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
152e0 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
152f0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
15300 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
15310 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
15320 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
15330 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
15340 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
15350 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
15360 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
15370 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
15380 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
15390 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
153a0 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
153b0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
153c0 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
153d0 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
153e0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
15410 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
15420 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
15430 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
15440 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
15450 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
15460 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
15470 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
15480 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
15490 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
154a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
154b0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
154c0 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
154d0 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
154e0 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
154f0 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
15500 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
15510 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
15520 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
15530 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
15540 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
15550 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
15560 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
15570 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
15580 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
15590 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
155a0 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20  ck journal uses 
155b0 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20  checksums - the 
155c0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
155d0 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a  l does .** not..
155e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
155f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
15600 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
15610 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15620 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15630 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
15640 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
15650 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
15660 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
15670 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
15680 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
15690 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
156a0 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
156b0 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
156c0 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
156d0 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
156e0 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
156f0 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
15700 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
15710 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
15720 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
15730 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
15740 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
15750 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
15760 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
15770 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
15780 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
15790 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
157a0 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
157b0 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
157c0 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
157d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
157e0 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
157f0 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
15800 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15810 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
15820 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
15830 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
15840 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
15850 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
15860 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
15870 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
15880 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15890 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
158a0 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
158b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
158c0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
158d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
158e0 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
158f0 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
15900 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15910 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15920 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
15930 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
15940 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
15950 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
15960 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
15970 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
15980 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
15990 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
159a0 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
159b0 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
159c0 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
159d0 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
159e0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
159f0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
15a00 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
15a10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
15a20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
15a30 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
15a40 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
15a50 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
15a60 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
15a70 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
15a80 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
15a90 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
15aa0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
15ab0 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
15ac0 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
15ad0 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
15ae0 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
15af0 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
15b00 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
15b10 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
15b20 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
15b30 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
15b40 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
15b50 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
15b60 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
15b70 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
15b80 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
15b90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15bb0 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
15bc0 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
15bd0 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  i64 *pOffset,   
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15bf0 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
15c00 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
15c10 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
15c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15c30 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
15c40 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
15c50 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
15c60 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
15c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
15c80 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
15c90 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
15ca0 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  l. */.  int isSa
15cb0 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20  vepnt           
15cc0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
15cd0 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
15ce0 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  llback */.){.  i
15cf0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
15d00 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
15d10 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
15d20 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
15d30 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
15d40 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
15d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15d60 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
15d70 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
15d80 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
15d90 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
15da0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
15db0 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
15dc0 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
15dd0 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20  char *aData;    
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15df0 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
15e00 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
15e10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
15e20 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
15e30 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
15e40 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
15e50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
15e60 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64  /.  int isSynced
15e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15e80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
15e90 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e  rnal page is syn
15ea0 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ced */..  assert
15eb0 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
15ec0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
15ed0 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
15ee0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
15ef0 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
15f00 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
15f10 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
15f20 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
15f30 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
15f40 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
15f50 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
15f60 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
15f70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
15f80 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
15f90 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
15fa0 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
15fb0 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
15fc0 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
15fd0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
15fe0 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
15ff0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
16000 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
16010 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
16020 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
16030 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
16040 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
16050 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
16060 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
16070 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65  .  /* Either the
16080 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65   state is greate
16090 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49  r than PAGER_WRI
160a0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20  TER_CACHEMOD (a 
160b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
160c0 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  * or savepoint r
160d0 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20  ollback done at 
160e0 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74  the request of t
160f0 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68  he caller) or th
16100 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74  is is.  ** a hot
16110 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
16120 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f  k. If it is a ho
16130 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16140 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20  ck, the pager.  
16150 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f  ** is in state O
16160 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e  PEN and holds an
16170 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
16180 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot-journal rol
16190 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20  lback.  ** only 
161a0 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  reads from the m
161b0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  ain journal, not
161c0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
161d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
161e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
161f0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
16200 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
16210 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
16220 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
16230 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
16240 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
16250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
16260 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
16270 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
16280 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e  MOD || isMainJrn
16290 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  l );..  /* Read 
162a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
162b0 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
162c0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
162d0 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
162e0 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
162f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
16300 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
16310 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
16320 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
16330 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
16340 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
16350 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
16360 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
16370 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
16380 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16390 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
163a0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
163b0 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
163c0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
163d0 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
163e0 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
163f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
16410 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
16420 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
16430 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
16440 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
16450 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
16460 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
16470 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
16480 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
16490 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
164a0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
164b0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
164c0 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
164d0 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
164e0 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
164f0 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
16500 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16510 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
16520 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
16530 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
16540 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
16550 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
16560 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
16570 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
16580 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
16590 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
165a0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
165b0 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
165c0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
165d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
165e0 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
165f0 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
16600 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
16610 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
16620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16630 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
16640 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
16650 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
16660 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
16670 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
16680 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
16690 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
166a0 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
166b0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
166c0 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
166d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
166e0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
166f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
16700 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  s page has alrea
16710 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
16720 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20  y before during 
16730 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
16740 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
16750 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20  don't bother to 
16760 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61  play it back aga
16770 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
16780 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
16790 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
167a0 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51  Done, pgno))!=SQ
167b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
167c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
167d0 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
167e0 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65   back page 1, re
167f0 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72  store the nReser
16800 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  ve setting.  */.
16810 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26    if( pgno==1 &&
16820 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
16830 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b  e!=((u8*)aData)[
16840 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65  20] ){.    pPage
16850 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28  r->nReserve = ((
16860 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a  u8*)aData)[20];.
16870 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
16880 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
16890 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
168a0 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d  ger is in CACHEM
168b0 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  OD state, then t
168c0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
168d0 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
168e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
168f0 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
16900 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
16910 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
16920 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
16930 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16940 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
16950 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
16960 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
16970 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
16980 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
16990 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
169a0 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
169b0 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
169c0 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
169d0 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
169e0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
169f0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
16a00 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
16a10 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
16a20 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
16a30 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
16a40 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
16a50 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
16a60 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
16a70 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
16a80 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
16a90 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
16aa0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
16ab0 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
16ac0 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
16ad0 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
16ae0 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
16af0 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42   If in WRITER_DB
16b00 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49  MOD, WRITER_FINI
16b10 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  SHED or OPEN sta
16b20 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
16b30 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  te the.  ** page
16b40 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
16b50 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69  ists and the mai
16b60 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
16b70 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
16b80 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e  .  ** not dirty.
16b90 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65   Since this code
16ba0 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65   is only execute
16bb0 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  d in PAGER_OPEN 
16bc0 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61  state for.  ** a
16bd0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16be0 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61  lback, it is gua
16bf0 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
16c00 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65   page-cache is e
16c10 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65  mpty.  ** if the
16c20 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45   pager is in OPE
16c30 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20  N state..  **.  
16c40 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
16c50 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
16c60 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
16c70 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
16c80 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
16c90 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
16ca0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
16cb0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
16cc0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
16cd0 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
16ce0 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
16cf0 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
16d00 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
16d10 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
16d20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
16d30 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
16d40 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
16d50 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
16d60 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
16d70 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
16d80 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
16d90 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
16da0 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
16db0 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
16dc0 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
16dd0 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
16de0 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
16df0 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
16e00 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
16e10 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
16e20 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
16e30 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
16e40 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
16e50 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
16e60 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
16e70 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
16e80 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
16e90 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
16ea0 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
16eb0 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
16ec0 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
16ed0 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
16ee0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
16ef0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
16f00 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
16f10 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
16f20 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
16f30 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
16f40 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
16f50 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
16f60 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
16f70 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
16f80 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
16f90 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
16fa0 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
16fb0 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
16fc0 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
16fd0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
16fe0 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
16ff0 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
17000 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
17010 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
17020 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
17030 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
17040 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
17050 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
17060 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
17070 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
17080 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
17090 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
170a0 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
170b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72    */.  if( pager
170c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
170d0 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
170e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20   }else{.    pPg 
170f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
17100 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
17110 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  o);.  }.  assert
17120 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20  ( pPg || !MEMDB 
17130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
17140 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
17150 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d  ER_OPEN || pPg==
17160 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
17170 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
17180 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
17190 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
171a0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
171b0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
171c0 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
171d0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
171e0 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
171f0 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
17200 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
17210 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
17220 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
17230 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
17240 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
17250 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
17260 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
17270 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
17280 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
17290 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
172a0 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
172b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
172c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
172d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
172e0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
172f0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
17300 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
17310 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
17320 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
17330 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
17340 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
17350 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
17360 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
17370 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
17380 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
17390 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
173a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
173b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
173c0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
173d0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
173e0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
173f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
17400 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
17410 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
17420 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
17430 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
17440 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
17450 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
17460 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
17470 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
17480 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
17490 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
174a0 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
174b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
174c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
174d0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
174e0 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
174f0 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
17500 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
17510 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
17520 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
17530 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  M, aData);.    }
17540 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
17550 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
17560 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
17570 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
17580 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
17590 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
175a0 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
175b0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
175c0 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
175d0 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
175e0 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
175f0 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
17600 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
17610 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
17620 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
17630 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
17640 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
17650 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
17660 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
17670 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
17680 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
17690 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
176a0 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
176b0 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
176c0 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
176d0 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
176e0 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
176f0 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
17700 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
17710 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
17720 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
17730 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
17740 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
17750 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
17760 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
17770 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
17780 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
17790 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
177a0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
177b0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
177c0 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
177d0 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
177e0 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
177f0 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
17800 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
17810 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
17820 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
17830 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
17840 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
17850 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
17860 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
17870 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
17880 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
17890 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
178a0 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
178b0 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
178c0 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
178d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
178e0 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73  avepnt );.    as
178f0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
17900 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
17910 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d  LFLAG_ROLLBACK)=
17920 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
17930 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
17940 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17950 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  CK;.    rc = sql
17960 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
17970 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
17980 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pPg, 1);.    ass
17990 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
179a0 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
179b0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d  FLAG_ROLLBACK)!=
179c0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
179d0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e  >doNotSpill &= ~
179e0 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
179f0 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  CK;.    if( rc!=
17a00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
17a10 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e  rn rc;.    pPg->
17a20 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
17a30 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73  NEED_READ;.    s
17a40 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
17a50 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
17a60 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
17a70 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
17a80 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
17a90 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
17aa0 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
17ab0 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
17ac0 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
17ad0 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
17ae0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
17af0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
17b00 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
17b10 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
17b20 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
17b30 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
17b40 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
17b50 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
17b60 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
17b70 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
17b80 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
17b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
17ba0 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
17bb0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
17bc0 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
17bd0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
17be0 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29  cpy(pData, (u8*)
17bf0 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
17c00 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  ageSize);.    pP
17c10 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
17c20 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73  pPg);.    if( is
17c30 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73  MainJrnl && (!is
17c40 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66  Savepnt || *pOff
17c50 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  set<=pPager->jou
17c60 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20  rnalHdr) ){.    
17c70 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74    /* If the cont
17c80 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
17c90 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74  e were just rest
17ca0 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ored from the ma
17cb0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  in .      ** jou
17cc0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
17cd0 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  its content must
17ce0 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65   be as they were
17cf0 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20   when the .     
17d00 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
17d10 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
17d20 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  . In this case w
17d30 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70  e can mark the p
17d40 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  age.      ** as 
17d50 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65  clean, since the
17d60 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65  re will be no ne
17d70 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f  ed to write it o
17d80 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ut to the.      
17d90 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
17da0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
17db0 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65  here is one exce
17dc0 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75  ption to this ru
17dd0 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  le. If the page 
17de0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a  is being rolled.
17df0 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73        ** back as
17e00 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70   part of a savep
17e10 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65  oint (or stateme
17e20 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f  nt) rollback fro
17e30 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75  m an .      ** u
17e40 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
17e50 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
17e60 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
17e70 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20  t is not safe.  
17e80 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74      ** to mark t
17e90 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
17ea0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
17eb0 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61  e marking the pa
17ec0 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63  ge as.      ** c
17ed0 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20  lean will clear 
17ee0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
17ef0 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20  YNC flag. Since 
17f00 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20  the page is.    
17f10 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20    ** already in 
17f20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
17f30 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61   (recorded in Pa
17f40 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20  ger.pInJournal) 
17f50 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
17f60 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
17f70 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64   flag is cleared
17f80 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
17f90 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
17fa0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69    ** again withi
17fb0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
17fc0 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d  on, it will be m
17fd0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62  arked as dirty b
17fe0 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
17ff0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
18000 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65  flag will not be
18010 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74   set. It could t
18020 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a  hen potentially.
18030 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74        ** be writ
18040 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65  ten out into the
18050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
18060 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61  efore its journa
18070 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  l file.      ** 
18080 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65  segment is synce
18090 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63  d. If a crash oc
180a0 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66  curs during or f
180b0 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20  ollowing this,. 
180c0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
180d0 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
180e0 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  ensue..      */.
180f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
18100 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
18110 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r) );.      sqli
18120 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
18130 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  an(pPg);.    }. 
18140 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
18150 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20  ehash(pPg);..   
18160 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
18170 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
18180 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
18190 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
181a0 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
181b0 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
181c0 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
181d0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
181e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
181f0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
18200 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
18210 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
18220 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
18230 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
18240 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
18250 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
18260 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
18270 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
18280 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
18290 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
182a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
182b0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
182c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
182d0 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
182e0 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
182f0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
18300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
18310 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
18320 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
18330 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
18340 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18350 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
18360 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
18370 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
18380 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
18390 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
183a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
183b0 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
183c0 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
183d0 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
183e0 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
183f0 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
18400 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
18410 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
18420 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
18430 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
18440 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
18450 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
18460 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
18470 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
18480 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
18490 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
184a0 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
184b0 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
184c0 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
184d0 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
184e0 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
184f0 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
18500 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
18510 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
18520 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
18530 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
18540 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
18550 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
18560 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
18570 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
18580 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
18590 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
185a0 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
185b0 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
185c0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
185d0 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
185e0 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
185f0 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
18600 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
18610 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
18620 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
18630 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
18640 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
18650 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
18660 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
18670 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
18680 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
18690 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
186a0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
186b0 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
186c0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
186d0 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
186e0 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
186f0 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
18700 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
18710 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
18720 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
18730 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
18740 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
18750 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
18760 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
18770 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
18780 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
18790 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
187a0 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
187b0 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
187c0 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
187d0 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
187e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
187f0 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
18800 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
18810 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
18820 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
18830 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
18840 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
18850 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
18860 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
18870 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
18880 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
18890 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
188a0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
188b0 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
188c0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
188d0 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
188e0 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
188f0 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
18900 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
18910 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
18920 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
18930 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
18940 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
18950 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
18960 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
18970 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
18980 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
18990 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
189a0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
189b0 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
189c0 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
189d0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
189e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
189f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18a00 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
18a10 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
18a20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
18a30 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
18a40 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
18a50 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
18a60 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
18a70 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
18a80 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
18a90 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
18aa0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
18ab0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
18ac0 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
18af0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
18b00 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
18b10 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
18b20 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18b30 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
18b40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
18b50 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
18b60 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
18b70 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
18b80 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
18b90 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
18ba0 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
18bb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18bc0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
18bd0 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
18be0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
18bf0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18c00 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
18c10 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
18c20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
18c30 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
18c40 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
18c50 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
18c60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
18c70 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
18c80 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
18c90 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
18ca0 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
18cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
18cc0 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
18cd0 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
18ce0 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
18cf0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
18d00 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
18d10 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
18d20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
18d30 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
18d40 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
18d50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18d60 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
18d70 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
18d80 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18d90 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
18da0 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
18db0 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
18dc0 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
18dd0 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
18de0 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
18df0 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
18e00 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
18e10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18e20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
18e30 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
18e40 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
18e50 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
18e60 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
18e70 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
18e80 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
18e90 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
18ea0 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
18eb0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
18ec0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
18ed0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
18ee0 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
18ef0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18f00 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
18f10 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
18f20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
18f30 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
18f40 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
18f50 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
18f60 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
18f70 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
18f80 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
18f90 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
18fa0 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
18fb0 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
18fc0 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
18fd0 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
18fe0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
18ff0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
19000 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
19010 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19030 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
19040 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
19050 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
19060 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
19070 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
19080 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  ite3Malloc(nMast
19090 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
190a0 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
190b0 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
190c0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
190d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
190e0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
190f0 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
19100 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
19110 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
19120 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  rc 
19130 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
19140 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
19150 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
19160 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
19170 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19180 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19190 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d  master_out;.  zM
191a0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
191b0 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
191c0 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
191d0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
191e0 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
191f0 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
19200 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
19210 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
19220 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
19230 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
19240 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
19250 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
19260 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
19270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
19290 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
192a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
192b0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
192c0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
192d0 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
192e0 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
192f0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
19300 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
19310 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
19320 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
19330 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
19340 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
19350 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
19360 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
19370 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
19380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
19390 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
193a0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
193b0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
193c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
193d0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
193e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
193f0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
19400 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
19410 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19430 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19440 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19450 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
19460 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
19470 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
19480 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
19490 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
194a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
194b0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
194c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
194d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
194e0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
194f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
19500 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
19510 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
19520 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
19530 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
19540 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
19550 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
19560 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
19570 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19580 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
19590 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
195a0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
195b0 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
195c0 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
195d0 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
195e0 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
195f0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
19600 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19610 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
19620 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
19630 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
19640 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
19650 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19660 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
19670 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19680 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
19690 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
196a0 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
196b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
196c0 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
196d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
196e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
196f0 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
19700 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
19710 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19720 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
19730 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
19740 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
19750 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
19760 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
19770 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
19780 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
19790 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
197a0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
197b0 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
197c0 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
197d0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
197e0 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
197f0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
19800 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
19810 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
19820 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
19830 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
19840 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
19850 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
19860 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
19870 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
19880 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
19890 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
198a0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
198b0 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
198c0 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
198d0 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
198e0 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
198f0 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
19900 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
19910 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  r, it might be t
19920 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
19930 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
19940 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
19950 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
19960 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
19970 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
19980 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
19990 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
199a0 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
199b0 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
199c0 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
199d0 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
199e0 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
199f0 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
19a00 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
19a10 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
19a20 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
19a30 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
19a40 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
19a50 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
19a60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
19a70 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
19a80 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
19a90 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
19aa0 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
19ab0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
19ac0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
19ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
19ae0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
19af0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
19b00 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
19b10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19b20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19b30 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
19b40 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
19b50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
19b60 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
19b70 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  .  .  if( isOpen
19b80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  (pPager->fd) .  
19b90 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
19ba0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
19bb0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
19bc0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
19bd0 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20  _OPEN) .  ){.   
19be0 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
19bf0 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69  , newSize;.    i
19c00 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67  nt szPage = pPag
19c10 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
19c20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19c30 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
19c40 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f  VE_LOCK );.    /
19c50 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
19c60 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
19c70 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
19c80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
19c90 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
19ca0 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
19cb0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
19cc0 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28  wSize = szPage*(
19cd0 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
19ce0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19cf0 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
19d00 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19d10 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
19d20 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
19d30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19d40 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
19d50 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
19d60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19d70 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73  ( (currentSize+s
19d80 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20  zPage)<=newSize 
19d90 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
19da0 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e  *pTmp = pPager->
19db0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20  pTmpSpace;.     
19dc0 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20     memset(pTmp, 
19dd0 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  0, szPage);.    
19de0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
19df0 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d  ewSize-szPage) =
19e00 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b  = currentSize );
19e10 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19e20 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
19e30 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69  ge) >  currentSi
19e40 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ze );.        rc
19e50 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
19e60 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54  e(pPager->fd, pT
19e70 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53  mp, szPage, newS
19e80 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20  ize-szPage);.   
19e90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
19ea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19eb0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19ec0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
19ed0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
19ee0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
19ef0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
19f00 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76  rn a sanitized v
19f10 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65  ersion of the se
19f20 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20  ctor-size of OS 
19f30 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a  file pFile. The.
19f40 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
19f50 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
19f60 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20   lie between 32 
19f70 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  and MAX_SECTOR_S
19f80 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IZE..*/.int sqli
19f90 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71  te3SectorSize(sq
19fa0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
19fb0 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d  e){.  int iRet =
19fc0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
19fd0 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69  Size(pFile);.  i
19fe0 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20  f( iRet<32 ){.  
19ff0 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20    iRet = 512;.  
1a000 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d  }else if( iRet>M
1a010 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
1a020 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
1a030 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
1a040 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d  12 );.    iRet =
1a050 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a060 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1a070 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Ret;.}../*.** Se
1a080 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
1a090 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1a0a0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
1a0b0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
1a0c0 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
1a0d0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a0e0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1a0f0 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
1a100 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1a110 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
1a120 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1a130 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
1a140 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
1a150 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
1a160 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
1a170 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
1a180 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
1a190 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
1a1a0 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
1a1b0 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
1a1c0 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
1a1d0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a1e0 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
1a1f0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
1a200 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
1a210 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a220 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a230 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
1a240 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1a250 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1a260 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
1a270 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
1a280 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
1a290 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
1a2a0 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
1a2b0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
1a2c0 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
1a2d0 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
1a2e0 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _SIZE..**.** If 
1a2f0 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65  the file has the
1a300 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1a310 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a320 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  E property, then
1a330 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65   set.** the effe
1a340 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a350 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d  e to its minimum
1a360 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54   value (512).  T
1a370 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a  he purpose of.**
1a380 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1a390 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65  ize is to define
1a3a0 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69   the "blast radi
1a3b0 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61  us" of bytes tha
1a3c0 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
1a3d0 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63  e if a crash occ
1a3e0 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e  urs while writin
1a3f0 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79  g to a single by
1a400 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61  te in.** that ra
1a410 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50  nge.  But with P
1a420 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a430 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61  TE, the blast ra
1a440 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  dius is zero.** 
1a450 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f  (that is what PO
1a460 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a470 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20  E means), so we 
1a480 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63  minimize the sec
1a490 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f  tor.** size.  Fo
1a4a0 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
1a4b0 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  atibility of the
1a4c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a4d0 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a  l file format,.*
1a4e0 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75  * we cannot redu
1a4f0 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1a500 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c   sector size bel
1a510 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69  ow 512..*/.stati
1a520 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
1a530 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
1a540 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
1a550 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a560 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1a570 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
1a580 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a590 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
1a5a0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1a5b0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1a5c0 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20  d) & .          
1a5d0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1a5e0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a5f0 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RITE)!=0.  ){.  
1a600 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
1a610 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
1a620 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1a630 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
1a640 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
1a650 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
1a660 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
1a670 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
1a680 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1a690 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
1a6a0 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ult. */.    pPag
1a6b0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1a6c0 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   512;.  }else{. 
1a6d0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a6e0 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53  rSize = sqlite3S
1a6f0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1a700 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->fd);.  }.}../*
1a710 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
1a720 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
1a730 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
1a740 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
1a750 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
1a760 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
1a770 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
1a780 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
1a790 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a7a0 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
1a7b0 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
1a7c0 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
1a7d0 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
1a7e0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
1a7f0 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
1a800 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a810 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1a820 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
1a830 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
1a840 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
1a850 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
1a860 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1a870 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
1a880 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
1a890 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
1a8a0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
1a8b0 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
1a8c0 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
1a8d0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a8e0 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
1a8f0 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
1a900 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
1a910 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
1a920 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
1a930 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a940 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1a950 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
1a960 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
1a970 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
1a980 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
1a990 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a9a0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a9b0 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
1a9c0 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
1a9d0 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
1a9e0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
1a9f0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
1aa00 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1aa10 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1aa20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
1aa30 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
1aa40 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
1aa50 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
1aa60 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
1aa70 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
1aa80 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
1aa90 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
1aaa0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1aab0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1aac0 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
1aad0 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1aae0 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
1aaf0 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
1ab00 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
1ab10 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
1ab20 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1ab30 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
1ab40 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
1ab50 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
1ab60 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
1ab70 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
1ab80 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
1ab90 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
1aba0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
1abb0 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
1abc0 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
1abd0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
1abe0 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
1abf0 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1ac00 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
1ac10 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
1ac20 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
1ac30 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
1ac40 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1ac50 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
1ac60 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
1ac70 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
1ac80 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
1ac90 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
1aca0 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
1acb0 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
1acc0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1acd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
1ace0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1acf0 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
1ad00 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
1ad10 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
1ad20 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
1ad30 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
1ad40 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
1ad50 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
1ad60 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
1ad70 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
1ad80 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
1ad90 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
1ada0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
1adb0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
1adc0 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
1add0 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
1ade0 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1adf0 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
1ae00 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
1ae10 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
1ae20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
1ae30 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
1ae40 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
1ae50 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
1ae60 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
1ae70 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
1ae80 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
1ae90 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
1aea0 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
1aeb0 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
1aec0 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
1aed0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1aee0 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
1aef0 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
1af00 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
1af10 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
1af20 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
1af30 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1af40 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
1af50 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
1af60 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
1af70 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
1af80 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
1af90 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
1afa0 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
1afb0 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
1afc0 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
1afd0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1afe0 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
1aff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
1b000 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
1b010 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1b020 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
1b030 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
1b040 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
1b050 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
1b060 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
1b070 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1b080 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
1b090 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
1b0a0 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
1b0b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b0c0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
1b0d0 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
1b0e0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
1b0f0 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1b100 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
1b110 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
1b120 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
1b130 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
1b140 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
1b150 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
1b160 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
1b170 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
1b180 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
1b190 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
1b1a0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1b1b0 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
1b1c0 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
1b1d0 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
1b1e0 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
1b1f0 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
1b200 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
1b210 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
1b220 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
1b230 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
1b240 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
1b250 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1b260 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
1b270 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b280 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1b290 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b2b0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1b2c0 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
1b2d0 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b2f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
1b300 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
1b310 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1b340 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
1b350 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
1b360 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b370 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
1b380 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
1b390 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b3b0 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
1b3c0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b3d0 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
1b3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1b3f0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1b400 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1b410 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1b420 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1b430 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
1b440 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1b450 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
1b460 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
1b470 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
1b480 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
1b490 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
1b4a0 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  back */.  int nP
1b4b0 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20  layback = 0;    
1b4c0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1b4d0 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74  er of pages rest
1b4e0 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ored from journa
1b4f0 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  l */..  /* Figur
1b500 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
1b510 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
1b520 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
1b530 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
1b540 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
1b550 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
1b560 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1b570 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
1b580 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1b590 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1b5a0 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
1b5b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b5c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b5d0 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
1b5e0 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
1b5f0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
1b600 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b610 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
1b620 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
1b630 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b640 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
1b650 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
1b660 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
1b670 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
1b680 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1b690 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
1b6a0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1b6b0 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
1b6c0 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
1b6d0 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
1b6e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1b6f0 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
1b700 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
1b710 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
1b720 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
1b730 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
1b740 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
1b750 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
1b760 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b770 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
1b780 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
1b790 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
1b7a0 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61  ,.  **  mxPathna
1b7b0 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1b7c0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1b7d0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1b7e0 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1b7f0 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1b800 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1b810 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1b820 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1b830 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1b840 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1b850 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1b860 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1b870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b880 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1b890 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1b8a0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1b8b0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1b8c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1b8d0 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1b8e0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1b8f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b900 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1b910 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1b920 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1b930 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1b940 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1b950 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1b960 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1b970 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1b980 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1b990 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1b9a0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1b9b0 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1b9c0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1b9d0 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1b9e0 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1b9f0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1ba00 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1ba10 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1ba20 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1ba30 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1ba40 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1ba50 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1ba60 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1ba70 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1ba80 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1ba90 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1baa0 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1bab0 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1bac0 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1bad0 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1bae0 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1baf0 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1bb00 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1bb10 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1bb20 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1bb30 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1bb40 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1bb50 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1bb60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bb70 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1bb80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1bb90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1bba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bbb0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1bbc0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1bbd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1bbe0 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1bbf0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1bc00 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1bc10 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1bc20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1bc30 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1bc40 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1bc50 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1bc60 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1bc70 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1bc80 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1bc90 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1bca0 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1bcb0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1bcc0 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1bcd0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1bce0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bcf0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1bd00 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1bd10 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1bd20 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1bd30 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1bd40 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1bd50 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1bd60 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1bd70 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1bd80 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1bd90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1bda0 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1bdb0 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1bdc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1bdd0 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1bde0 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1bdf0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1be00 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1be10 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1be20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1be30 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1be40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1be50 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1be60 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1be70 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1be80 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1be90 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1bea0 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1beb0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1bec0 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1bed0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1bee0 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1bef0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1bf00 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1bf10 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1bf20 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1bf30 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1bf40 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1bf50 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1bf60 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1bf70 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1bf80 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1bf90 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1bfa0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1bfb0 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1bfc0 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1bfd0 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1bfe0 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1bff0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1c000 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1c010 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1c020 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1c030 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1c040 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1c050 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1c060 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1c070 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1c080 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1c090 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1c0a0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1c0b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1c0c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1c0d0 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1c0e0 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1c0f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1c100 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1c110 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1c120 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1c130 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1c140 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1c150 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1c160 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1c170 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1c180 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1c190 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1c1a0 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1c1b0 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1c1c0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1c1d0 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1c1e0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1c1f0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1c200 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1c210 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1c220 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1c230 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1c240 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1c250 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1c260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1c280 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c2a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1c2b0 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1c2c0 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1c2d0 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1c2e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1c2f0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1c300 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1c310 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1c320 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1c330 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1c340 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1c350 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1c360 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1c370 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1c380 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1c390 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1c3a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1c3b0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1c3c0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1c3d0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1c3e0 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1c3f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
1c410 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20  Playback++;.    
1c420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c440 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c450 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c460 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1c470 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c480 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1c490 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1c4a0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1c4b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1c4c0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1c4d0 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1c4e0 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1c4f0 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1c500 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1c510 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1c520 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1c530 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1c540 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1c550 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1c560 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1c570 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1c580 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1c590 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1c5a0 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1c5b0 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1c5c0 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1c5d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1c5e0 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1c5f0 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1c600 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1c610 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1c620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c630 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1c640 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c650 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c660 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1c670 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1c680 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1c690 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1c6a0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1c6b0 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1c6c0 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1c6d0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1c6e0 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1c6f0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1c700 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1c710 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1c720 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1c730 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1c740 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1c750 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1c760 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1c770 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1c780 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1c790 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c7a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c7b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c7c0 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1c7d0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1c7e0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1c7f0 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
1c800 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
1c810 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1c820 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
1c830 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
1c840 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
1c850 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
1c860 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
1c870 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
1c880 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1c890 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
1c8a0 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
1c8b0 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
1c8c0 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
1c8d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c8e0 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
1c8f0 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  fied..  */.#ifde
1c900 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1c910 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
1c920 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1c930 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
1c940 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
1c950 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1c960 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1c970 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1c980 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
1c990 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
1c9a0 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
1c9b0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1c9c0 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
1c9d0 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
1c9e0 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
1c9f0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1ca00 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
1ca10 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
1ca20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
1ca30 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
1ca40 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1ca50 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
1ca60 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
1ca70 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
1ca80 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
1ca90 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
1caa0 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
1cab0 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
1cac0 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
1cad0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
1cae0 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
1caf0 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
1cb00 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1cb10 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
1cb20 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
1cb30 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
1cb40 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
1cb50 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
1cb60 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1cb70 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
1cb80 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
1cb90 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
1cba0 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
1cbb0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1cbc0 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
1cbd0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1cbe0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1cbf0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1cc00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cc10 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
1cc20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1cc30 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
1cc40 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1cc50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1cc60 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1cc70 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1cc80 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cc90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cca0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1ccb0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
1ccc0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1ccd0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1cce0 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1ccf0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1cd00 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  N).  ){.    rc =
1cd10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1cd20 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
1cd30 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1cd40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1cd50 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1cd60 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1cd70 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
1cd80 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61  , 0);.    testca
1cd90 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cda0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cdb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cdc0 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
1cdd0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
1cde0 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
1cdf0 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
1ce00 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1ce10 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
1ce20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
1ce30 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
1ce40 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1ce50 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
1ce60 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
1ce70 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
1ce80 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1ce90 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1cea0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1ceb0 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e    if( isHot && n
1cec0 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20  Playback ){.    
1ced0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
1cee0 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
1cef0 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63  R_ROLLBACK, "rec
1cf00 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20  overed %d pages 
1cf10 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20  from %s",.      
1cf20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62            nPlayb
1cf30 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ack, pPager->zJo
1cf40 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  urnal);.  }..  /
1cf50 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1cf60 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1cf70 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1cf80 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1cf90 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1cfa0 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1cfb0 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1cfc0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1cfd0 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1cfe0 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1cff0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1d000 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1d010 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1d020 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1d030 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1d040 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1d050 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1d060 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1d070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d080 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
1d090 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1d0a0 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1d0b0 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1d0c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d0d0 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1d0e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1d0f0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1d100 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1d110 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1d120 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1d130 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1d140 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1d150 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1d160 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1d170 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1d180 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1d190 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1d1a0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1d1b0 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1d1c0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1d1d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1d1e0 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1d1f0 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75  ge(PgHdr *pPg, u
1d200 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61  32 iFrame){.  Pa
1d210 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1d220 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1d230 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1d240 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1d250 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1d260 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1d270 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1d280 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1d290 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d2a0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1d2b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1d2c0 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1d2d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1d2e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1d2f0 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1d300 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d310 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1d320 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1d330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1d340 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1d350 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1d360 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66  TE_OMIT_WAL.  if
1d370 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ( iFrame ){.    
1d380 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1d390 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1d3a0 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1d3b0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1d3c0 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d  lite3WalReadFram
1d3d0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1d3e0 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50  iFrame, pgsz, pP
1d3f0 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c  g->pData);.  }el
1d400 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
1d410 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
1d420 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1d430 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1d440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d450 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1d460 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1d470 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  gsz, iOffset);. 
1d480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d490 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1d4a0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
1d4b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d4c0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
1d4d0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1d4e0 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1d4f0 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1d500 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1d510 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1d520 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1d530 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1d540 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1d550 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1d560 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1d570 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1d580 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1d590 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d5a0 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1d5b0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1d5c0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1d5d0 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1d5e0 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1d5f0 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1d600 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1d610 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1d620 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1d630 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1d640 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1d650 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1d660 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1d670 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1d680 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1d690 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1d6a0 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1d6b0 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1d6c0 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1d6d0 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1d6e0 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1d6f0 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1d700 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1d710 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1d720 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1d730 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1d740 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20   noise equaling 
1d750 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66  16 bytes of 0xff
1d760 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20   is vanishingly 
1d770 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a  small so.      *
1d780 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c  * we should stil
1d790 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a  l be ok..      *
1d7a0 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  /.      memset(p
1d7b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d7c0 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28  s, 0xff, sizeof(
1d7d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d7e0 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rs));.    }else{
1d7f0 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c  .      u8 *dbFil
1d800 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
1d810 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
1d820 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1d830 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d840 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1d850 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1d860 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1d870 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1d880 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
1d890 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
1d8a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
1d8b0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1d8c0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
1d8d0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
1d8e0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1d8f0 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
1d900 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
1d910 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1d920 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
1d930 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1d940 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1d950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d960 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1d970 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
1d980 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
1d990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d9a0 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
1d9b0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61  value of the cha
1d9c0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f  nge-counter at o
1d9d0 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32  ffsets 24 and 92
1d9e0 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   in.** the heade
1d9f0 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  r and the sqlite
1da00 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1da10 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
1da20 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75  .** This is an u
1da30 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64  nconditional upd
1da40 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74  ate.  See also t
1da50 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  he pager_incr_ch
1da60 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a  angecounter().**
1da70 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f   routine which o
1da80 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  nly updates the 
1da90 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
1daa0 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20  f the update is 
1dab0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64  actually.** need
1dac0 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65  ed, as determine
1dad0 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d  d by the pPager-
1dae0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1daf0 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e   state variable.
1db00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1db10 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1db20 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20  gecounter(PgHdr 
1db30 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61  *pPg){.  u32 cha
1db40 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20  nge_counter;..  
1db50 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1db60 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1db70 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1db80 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1db90 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1dba0 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
1dbb0 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70  byte((u8*)pPg->p
1dbc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1dbd0 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74  s)+1;.  put32bit
1dbe0 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1dbf0 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
1dc00 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a  _counter);..  /*
1dc10 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20   Also store the 
1dc20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
1dc30 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39  umber in bytes 9
1dc40 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a  6..99 and in.  *
1dc50 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73  * bytes 92..95 s
1dc60 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20  tore the change 
1dc70 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63  counter for whic
1dc80 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  h the version nu
1dc90 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c  mber.  ** is val
1dca0 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  id. */.  put32bi
1dcb0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1dcc0 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67  pData)+92, chang
1dcd0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75  e_counter);.  pu
1dce0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1dcf0 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  pPg->pData)+96, 
1dd00 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
1dd10 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64  UMBER);.}..#ifnd
1dd20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1dd30 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
1dd40 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1dd50 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1dd60 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
1dd70 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
1dd80 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1dd90 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
1dda0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1ddb0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
1ddc0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
1ddd0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
1dde0 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
1ddf0 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
1de00 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
1de10 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1de20 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1de30 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
1de40 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
1de50 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
1de60 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
1de70 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1de80 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
1de90 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
1dea0 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
1deb0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
1dec0 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
1ded0 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
1dee0 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
1def0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1df00 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
1df10 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
1df20 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1df30 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1df40 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
1df50 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
1df60 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1df70 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
1df80 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1df90 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
1dfa0 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
1dfb0 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
1dfc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1dfd0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1dfe0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1dff0 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
1e000 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
1e010 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1e020 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d  ager) );.  pPg =
1e030 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1e040 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1e050 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1e060 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1e070 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1e080 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1e090 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1e0a0 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1e0b0 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69  lse{.      u32 i
1e0c0 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  Frame = 0;.     
1e0d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1e0e0 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
1e0f0 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ->pWal, pPg->pgn
1e100 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
1e110 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e130 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1e140 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20  pPg, iFrame);.  
1e150 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e170 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1e180 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1e190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e1a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e1b0 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20  NotNull(pPg);.  
1e1c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
1e1d0 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61  rmally, if a tra
1e1e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1e1f0 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63  ed back, any bac
1e200 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72  kup processes ar
1e210 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61  e.  ** updated a
1e220 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64  s data is copied
1e230 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c   out of the roll
1e240 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
1e250 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
1e260 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
1e270 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70   not generally p
1e280 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57  ossible with a W
1e290 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a  AL database, as.
1e2a0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e    ** rollback in
1e2b0 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72  volves simply tr
1e2c0 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67  uncating the log
1e2d0 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65   file. Therefore
1e2e0 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72  , if one.  ** or
1e2f0 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76   more frames hav
1e300 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1e310 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
1e320 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  g (and therefore
1e330 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69   .  ** also copi
1e340 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b  ed into the back
1e350 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73  up databases) as
1e360 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72   part of this tr
1e370 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ansaction,.  ** 
1e380 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74  the backups must
1e390 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
1e3a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63   */.  sqlite3Bac
1e3b0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
1e3c0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20  r->pBackup);..  
1e3d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e3e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e3f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
1e400 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1e410 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
1e420 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1e430 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
1e440 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70  backWal(Pager *p
1e450 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1e460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e480 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
1e490 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4b0 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
1e4c0 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
1e4d0 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20  /..  /* For all 
1e4e0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1e4f0 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  he that are curr
1e500 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68  ently dirty or h
1e510 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
1e520 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62   been written (b
1e530 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  ut not committed
1e540 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  ) to the log fil
1e550 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65  e, do one of the
1e560 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   .  ** following
1e570 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20  :.  **.  **   + 
1e580 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68  Discard the cach
1e590 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63  ed page (if refc
1e5a0 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  ount==0), or.  *
1e5b0 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67  *   + Reload pag
1e5c0 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  e content from t
1e5d0 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20  he database (if 
1e5e0 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a  refcount>0)..  *
1e5f0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1e600 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
1e610 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  rigSize;.  rc = 
1e620 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70  sqlite3WalUndo(p
1e630 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67  Pager->pWal, pag
1e640 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20  erUndoCallback, 
1e650 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b  (void *)pPager);
1e660 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1e670 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1e680 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1e690 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  e);.  while( pLi
1e6a0 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
1e6b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
1e6c0 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
1e6d0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20  >pDirty;.    rc 
1e6e0 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  = pagerUndoCallb
1e6f0 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67  ack((void *)pPag
1e700 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
1e710 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  ;.    pList = pN
1e720 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
1e730 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e740 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e750 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
1e760 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  d sqlite3WalFram
1e770 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73  es(). As well as
1e780 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20   logging.** the 
1e790 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e7a0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65  list of pages he
1e7b0 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63  aded by pList (c
1e7c0 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
1e7d0 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ty),.** this fun
1e7e0 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61  ction notifies a
1e7f0 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70  ny active backup
1e800 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20   processes that 
1e810 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a  the pages have.*
1e820 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a  * changed. .**.*
1e830 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61  * The list of pa
1e840 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ges passed into 
1e850 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e860 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79  always sorted by
1e870 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1e880 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20   Hence, if page 
1e890 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65  1 appears anywhe
1e8a0 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20  re on the list, 
1e8b0 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66  it will be the f
1e8c0 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73  irst page..*/ .s
1e8d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57  tatic int pagerW
1e8e0 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65  alFrames(.  Page
1e8f0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1e900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1e910 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1e920 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20   PgHdr *pList,  
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d   /* List of fram
1e950 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50  es to log */.  P
1e960 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20  gno nTruncate,  
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e980 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1e990 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69  after this commi
1e9a0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  t */.  int isCom
1e9b0 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1e9c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e9d0 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d  f this is a comm
1e9e0 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  it */.){.  int r
1e9f0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1ea00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ea10 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1ea20 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20  nt nList;       
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1ea50 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20  s in pList */.  
1ea60 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1ea90 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20  ver pages */..  
1eaa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1eab0 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1eac0 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1ead0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1eae0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1eaf0 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1eb00 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1eb10 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1eb20 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1eb30 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1eb40 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1eb50 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1eb60 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1eb70 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1eb80 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  t( pList->pDirty
1eb90 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20  ==0 || isCommit 
1eba0 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69  );.  if( isCommi
1ebb0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  t ){.    /* If a
1ebc0 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1ebd0 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
1ebe0 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
1ebf0 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e   point in writin
1ec00 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67  g.    ** any pag
1ec10 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
1ec20 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
1ec30 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f  n nTruncate into
1ec40 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20   the WAL file.. 
1ec50 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20     ** They will 
1ec60 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79  never be read by
1ec70 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20   any client. So 
1ec80 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
1ec90 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20   the pDirty.    
1eca0 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f  ** list here. */
1ecb0 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e  .    PgHdr **ppN
1ecc0 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20  ext = &pList;.  
1ecd0 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    nList = 0;.   
1ece0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a   for(p=pList; (*
1ecf0 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20  ppNext = p)!=0; 
1ed00 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1ed10 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1ed20 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  =nTruncate ){.  
1ed30 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26        ppNext = &
1ed40 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  p->pDirty;.     
1ed50 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20     nList++;.    
1ed60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1ed70 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1ed80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73   }else{.    nLis
1ed90 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 1;.  }.  pPa
1eda0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
1edb0 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20  _STAT_WRITE] += 
1edc0 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c  nList;..  if( pL
1edd0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1ede0 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1edf0 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1ee00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1ee10 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1ee20 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1ee30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1ee40 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1ee50 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67  , isCommit, pPag
1ee60 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
1ee70 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1ee80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1ee90 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
1eea0 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1eeb0 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1eec0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1eed0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1eee0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1eef0 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1ef00 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1ef10 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ef20 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1ef30 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1ef40 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1ef50 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1ef60 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1ef70 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1ef80 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1ef90 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1efa0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1efb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1efc0 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1efd0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1efe0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1eff0 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1f000 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1f010 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1f020 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1f030 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1f040 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1f050 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1f060 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1f070 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1f080 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1f090 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1f0a0 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1f0b0 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1f0c0 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1f0d0 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1f0e0 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1f0f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f100 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1f110 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1f120 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f150 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1f160 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f180 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1f190 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1f1a0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1f1b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1f1c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f1d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1f1e0 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1f1f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f200 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1f210 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f220 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1f230 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1f240 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1f250 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1f260 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1f270 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1f280 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1f290 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1f2a0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1f2b0 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1f2c0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1f2d0 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1f2e0 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1f2f0 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1f300 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1f310 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1f320 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f330 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1f340 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1f350 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1f360 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1f370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f380 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1f390 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1f3a0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1f3b0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
1f3c0 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
1f3d0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
1f3e0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
1f3f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1f400 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1f410 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f420 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  led as part of t
1f430 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72  he transition fr
1f440 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  om PAGER_OPEN.**
1f450 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
1f460 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d   state to determ
1f470 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ine the size of 
1f480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f490 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61  e.** in pages (a
1f4a0 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65  ssuming the page
1f4b0 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20   size currently 
1f4c0 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
1f4d0 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a  pageSize)..**.**
1f4e0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
1f4f0 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
1f500 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1f510 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1f520 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61  atabase.** in pa
1f530 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ges is stored in
1f540 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77   *pnPage. Otherw
1f550 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
1f560 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53  de (perhaps.** S
1f570 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1f580 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  T) is returned a
1f590 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
1f5a0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  ft unmodified..*
1f5b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f5c0 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
1f5d0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1f5e0 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
1f5f0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1f600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1f610 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1f620 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1f630 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41   /* Query the WA
1f640 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72  L sub-system for
1f650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1f660 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a  ze. The WalDbsiz
1f670 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  e().  ** functio
1f680 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69  n returns zero i
1f690 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
1f6a0 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65   open (i.e. Page
1f6b0 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20  r.pWal==0), or. 
1f6c0 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62   ** if the datab
1f6d0 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ase size is not 
1f6e0 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64  available. The d
1f6f0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f700 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  not.  ** availab
1f710 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1f720 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68  sub-system if th
1f730 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d  e log file is em
1f740 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74  pty or.  ** cont
1f750 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f  ains no valid co
1f760 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
1f770 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
1f780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f790 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f7a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f7b0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1f7c0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61  ED_LOCK );.  nPa
1f7d0 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44  ge = sqlite3WalD
1f7e0 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
1f7f0 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  al);..  /* If th
1f800 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1f810 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1f820 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1f830 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  le from the.  **
1f840 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c   WAL sub-system,
1f850 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
1f860 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65 64  age counte based
1f870 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a   on the size of.
1f880 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1f890 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  e file.  If the 
1f8a0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1f8b0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1f8c0 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72   an.  ** integer
1f8d0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1f8e0 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e   page-size, roun
1f8f0 64 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e  d up the result.
1f900 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1f910 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20  e==0 ){.    i64 
1f920 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
1f930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1f940 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
1f950 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73  bytes */.    ass
1f960 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1f970 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1f980 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1f990 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1f9a0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1f9b0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1f9c0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1f9d0 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20  ager->fd, &n);. 
1f9e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f9f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fa00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fa10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
1fa20 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Page = (Pgno)((n
1fa30 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
1fa40 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70  e-1) / pPager->p
1fa50 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
1fa60 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1fa70 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
1fa80 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
1fa90 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
1faa0 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
1fab0 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1fac0 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1fad0 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1fae0 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1faf0 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1fb00 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1fb10 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1fb20 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1fb30 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1fb40 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1fb50 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1fb60 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1fb70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1fb80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1fb90 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
1fba0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
1fbb0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
1fbc0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1fbd0 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
1fbe0 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
1fbf0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fc00 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
1fc10 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
1fc20 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
1fc30 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
1fc40 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
1fc50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fc60 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
1fc70 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1fc80 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
1fc90 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fca0 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
1fcb0 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
1fcc0 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
1fcd0 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
1fce0 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
1fcf0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
1fd00 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
1fd10 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
1fd20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
1fd30 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
1fd40 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
1fd50 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
1fd60 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1fd70 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
1fd80 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
1fd90 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
1fda0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
1fdb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fdc0 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
1fdd0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
1fde0 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
1fdf0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
1fe00 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
1fe10 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
1fe20 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
1fe30 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
1fe40 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
1fe50 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
1fe60 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
1fe70 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
1fe80 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
1fe90 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
1fea0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
1feb0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
1fec0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1fed0 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
1fee0 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
1fef0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1ff00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ff10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ff20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1ff30 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1ff40 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1ff50 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
1ff60 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
1ff70 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
1ff80 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ffa0 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
1ffb0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50   exists */.    P
1ffc0 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ffe0 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  Size of the data
1fff0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
20000 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
20010 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
20020 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
20030 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20040 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
20050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20060 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
20070 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
20080 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  er->zWal, 0);.  
20090 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
200a0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
200b0 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c  NOENT ) rc = SQL
200c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73  ITE_OK;.      is
200d0 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Wal = 0;.    }el
200e0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
200f0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
20100 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
20110 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
20120 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
20130 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57  ESS_EXISTS, &isW
20140 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  al.      );.    
20150 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
20160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20170 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20   if( isWal ){.  
20180 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20190 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
201a0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
201b0 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
201c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
201d0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
201e0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
201f0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
20200 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
20210 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20220 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
20230 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20240 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
20250 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
20260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20270 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20280 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20290 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
202a0 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
202b0 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
202c0 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
202d0 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
202e0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
202f0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
20300 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
20310 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
20320 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
20330 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
20340 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
20350 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
20360 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
20370 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
20380 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
20390 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
203a0 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
203b0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
203c0 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
203d0 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
203e0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
203f0 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
20400 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
20410 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
20420 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
20430 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
20440 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
20450 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
20460 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
20470 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
20480 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
20490 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
204a0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
204b0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
204c0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
204d0 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
204e0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
204f0 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
20500 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
20510 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
20520 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
20530 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
20540 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
20550 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
20560 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
20570 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
20580 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
20590 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
205a0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
205b0 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
205c0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
205d0 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
205e0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
205f0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
20600 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
20610 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
20620 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
20630 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
20640 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
20650 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
20660 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
20670 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
20680 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
20690 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
206a0 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
206b0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
206c0 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
206d0 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
206e0 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
206f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
20700 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
20710 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
20720 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
20730 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
20740 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
20750 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
20760 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
20770 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
20780 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
20790 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
207a0 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
207b0 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
207c0 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
207d0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
207e0 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
207f0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20800 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
20810 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
20820 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
20830 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
20840 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
20850 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
20860 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
20870 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
20880 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
20890 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
208a0 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
208b0 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
208c0 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
208d0 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
208e0 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
208f0 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
20900 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
20910 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
20920 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
20930 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
20940 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
20950 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
20960 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
20970 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
20980 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20990 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
209a0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
209b0 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
209c0 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
209d0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
209e0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
209f0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
20a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
20a10 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
20a20 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
20a30 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
20a40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20a50 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
20a60 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
20a70 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
20a80 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
20a90 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
20aa0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
20ab0 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
20ac0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20ad0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
20ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20af0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
20b00 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
20b10 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
20b20 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
20b30 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
20b40 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
20b50 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
20b60 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
20b70 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
20b80 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
20b90 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20ba0 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
20bb0 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
20bc0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
20bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20be0 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
20bf0 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
20c00 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
20c10 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
20c20 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
20c30 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
20c40 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
20c50 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
20c60 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
20c70 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
20c80 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
20c90 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
20ca0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
20cb0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
20cc0 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
20cd0 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
20ce0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20cf0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
20d00 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
20d10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
20d20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20d30 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
20d40 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
20d50 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
20d60 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
20d70 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
20d80 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
20d90 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
20da0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20db0 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
20dc0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20dd0 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
20de0 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
20df0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20e00 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
20e10 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
20e20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
20e30 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
20e40 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
20e50 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
20e60 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
20e70 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
20e80 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
20e90 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20ea0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
20eb0 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
20ec0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
20ed0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
20ee0 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
20ef0 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
20f00 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
20f10 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
20f20 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
20f30 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
20f40 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
20f50 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
20f60 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
20f70 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
20f80 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
20f90 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
20fa0 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
20fb0 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
20fc0 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
20fd0 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
20fe0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
20ff0 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
21000 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
21010 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
21020 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
21030 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
21040 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
21050 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
21060 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
21070 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
21080 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
21090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
210a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
210b0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
210c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
210d0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
210e0 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
210f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
21100 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
21110 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21120 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21130 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
21140 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21150 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
21160 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
21170 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
21180 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
21190 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
211a0 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
211b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
211c0 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
211d0 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
211e0 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
211f0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21200 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
21210 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
21220 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
21230 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
21240 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
21250 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
21260 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
21270 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21280 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21290 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
212a0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
212b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
212c0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
212d0 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
212e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
212f0 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
21300 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
21310 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
21320 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
21330 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
21340 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
21350 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21360 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
21370 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
21380 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21390 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
213a0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
213b0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
213c0 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
213d0 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
213e0 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
213f0 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
21400 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
21410 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
21420 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
21430 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
21440 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
21450 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
21460 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21470 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21480 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21490 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
214a0 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
214b0 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
214c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
214d0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
214e0 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
214f0 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
21500 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
21510 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
21520 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
21530 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
21540 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
21550 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
21560 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
21570 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
21580 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21590 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
215a0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
215b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
215c0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
215d0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
215e0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
215f0 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
21600 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
21610 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
21620 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
21630 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
21640 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
21650 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
21660 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
21670 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
21680 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
21690 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
216a0 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
216b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
216c0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
216d0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
216e0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
216f0 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
21700 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
21710 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
21720 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
21730 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
21740 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21750 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21760 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
21770 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
21780 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
21790 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
217a0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
217b0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
217c0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
217d0 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
217e0 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
217f0 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
21800 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
21810 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21820 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
21830 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
21840 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21850 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
21860 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
21870 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21880 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
21890 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
218a0 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
218b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
218c0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
218d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
218e0 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
218f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
21900 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21910 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
21920 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
21930 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
21940 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21950 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
21960 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
21970 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
21980 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
21990 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
219a0 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
219b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
219c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
219d0 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e  AP_SIZE based on
219e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
219f0 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f  ue of szMmap..*/
21a00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
21a10 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61  erFixMaplimit(Pa
21a20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
21a30 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
21a40 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74  P_SIZE>0.  sqlit
21a50 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
21a60 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20  ager->fd;.  if( 
21a70 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64  isOpen(fd) && fd
21a80 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
21a90 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73  sion>=3 ){.    s
21aa0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
21ab0 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72  .    sz = pPager
21ac0 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50  ->szMmap;.    pP
21ad0 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20  ager->bUseFetch 
21ae0 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71  = (sz>0);.    sq
21af0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
21b00 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
21b10 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
21b20 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
21b30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
21b40 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21b50 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
21b60 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
21b70 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
21b80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
21b90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21ba0 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
21bb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
21bc0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
21bd0 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
21be0 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
21bf0 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
21c00 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
21c10 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
21c20 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
21c30 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
21c40 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
21c50 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
21c60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21c70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21c80 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
21c90 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
21ca0 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
21cb0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
21cc0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
21cd0 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
21ce0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
21cf0 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
21d00 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
21d10 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
21d20 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
21d30 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
21d40 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
21d50 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
21d60 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
21d70 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
21d80 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
21d90 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
21da0 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
21db0 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
21dc0 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
21dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
21de0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
21df0 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
21e00 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
21e10 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
21e20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
21e30 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
21e40 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
21e50 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
21e60 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
21e70 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
21e80 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
21e90 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
21ea0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
21eb0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
21ec0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
21ed0 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
21ef0 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
21f00 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
21f10 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
21f20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21f30 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
21f40 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
21f50 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
21f60 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
21f70 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
21f80 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
21f90 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
21fa0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21fc0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
21fd0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
21fe0 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
21ff0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
22000 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
22010 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
22020 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
22030 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
22040 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
22050 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
22060 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
22070 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
22080 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
22090 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
220a0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
220b0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
220c0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
220d0 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
220e0 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
220f0 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
22100 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
22110 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
22120 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
22130 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
22140 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
22150 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
22160 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
22170 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
22180 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
22190 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
221a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
221b0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
221c0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
221d0 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
221e0 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
221f0 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
22200 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
22210 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
22220 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
22230 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
22240 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
22250 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
22260 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
22270 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
22280 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
22290 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
222a0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
222b0 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
222c0 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
222d0 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
222e0 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
222f0 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
22300 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
22310 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
22320 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
22330 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
22340 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
22350 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
22360 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
22370 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
22380 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
22390 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
223a0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
223b0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
223c0 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
223d0 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a  ed with NORMAL..
223e0 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
223f0 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
22400 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
22410 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
22420 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
22430 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
22440 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
22450 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
22460 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
22470 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
22480 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
22490 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
224a0 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
224b0 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
224c0 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
224d0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
224e0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
224f0 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
22500 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
22510 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
22520 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
22530 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
22540 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
22550 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
22560 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
22570 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
22580 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
22590 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
225a0 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
225b0 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
225c0 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
225d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
225e0 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
225f0 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
22600 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
22610 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
22620 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
22630 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
22640 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
22650 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
22660 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
22670 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73  e pager to set s
22680 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20  afety level for 
22690 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
226a0 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61  Flags      /* Va
226b0 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29  rious flags */.)
226c0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76  {.  unsigned lev
226d0 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50  el = pgFlags & P
226e0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
226f0 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28  _MASK;.  assert(
22700 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76   level>=1 && lev
22710 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65  el<=3 );.  pPage
22720 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
22730 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
22740 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
22750 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
22760 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
22770 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
22780 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69  pFile) ?1:0;.  i
22790 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
227a0 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
227b0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
227c0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
227d0 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
227e0 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
227f0 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
22800 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
22810 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22820 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22830 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22840 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22850 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22860 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
22870 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
22880 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
22890 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
228a0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
228b0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
228c0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
228d0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
228e0 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
228f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22900 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22910 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
22920 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22930 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22940 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
22950 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
22960 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
22970 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
22980 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
22990 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
229a0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
229b0 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
229c0 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
229d0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
229e0 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
229f0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
22a00 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
22a10 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
22a20 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
22a30 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
22a40 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
22a50 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
22a60 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
22a70 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
22a80 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
22a90 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
22aa0 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
22ab0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
22ac0 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
22ad0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
22ae0 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
22af0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
22b00 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
22b10 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
22b20 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
22b30 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
22b40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
22b50 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
22b60 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
22b70 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
22b80 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
22b90 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22ba0 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
22bb0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
22bc0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
22bd0 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
22be0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22bf0 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
22c00 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
22c10 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
22c20 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
22c30 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
22c40 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
22c50 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
22c60 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
22c70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
22c80 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
22c90 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
22ca0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22cb0 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
22cc0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
22cd0 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
22ce0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
22cf0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
22d00 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
22d10 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
22d20 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
22d30 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22d40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22d50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
22d60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
22d70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
22d80 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22d90 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
22da0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
22db0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
22dc0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
22dd0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
22de0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22df0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
22e00 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
22e10 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
22e20 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
22e30 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
22e40 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
22e50 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
22e60 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
22e70 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
22e80 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
22e90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
22ea0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
22eb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
22ec0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
22ed0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
22ee0 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
22ef0 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
22f00 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
22f10 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
22f20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22f30 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
22f40 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
22f50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22f60 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
22f70 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
22f80 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
22f90 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
22fa0 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
22fb0 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
22fc0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
22fd0 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
22fe0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
22ff0 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
23000 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
23010 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
23020 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
23030 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
23040 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
23050 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
23060 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
23070 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
23080 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
23090 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
230a0 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
230b0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
230c0 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
230d0 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
230e0 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
230f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
23100 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
23110 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23130 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
23140 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
23150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23180 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
23190 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
231a0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
231b0 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
231c0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
231d0 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
231e0 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
231f0 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
23200 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
23210 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
23220 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
23230 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
23240 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
23250 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
23260 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
23270 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
23280 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
23290 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
232a0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
232b0 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
232c0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
232d0 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
232e0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
232f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23300 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
23310 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
23320 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
23330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23340 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
23350 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
23360 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
23370 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
23380 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
23390 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
233a0 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
233b0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
233c0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
233d0 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
233e0 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
233f0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23400 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
23410 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
23420 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
23430 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
23440 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
23450 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23460 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
23470 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
23480 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23490 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
234a0 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
234b0 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
234c0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
234d0 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
234e0 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
234f0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
23500 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
23510 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
23520 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
23530 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
23540 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
23550 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
23560 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
23570 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
23580 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
23590 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
235a0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
235b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
235c0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
235d0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
235e0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
235f0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
23600 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
23610 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
23620 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
23630 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
23640 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
23650 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
23660 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
23670 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
23680 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
23690 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
236a0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
236b0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
236c0 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
236d0 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
236e0 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
236f0 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
23700 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
23710 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
23720 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
23730 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
23740 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
23750 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
23760 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
23770 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
23780 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
23790 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
237a0 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
237b0 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
237c0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
237d0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
237e0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
237f0 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
23800 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
23810 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
23820 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
23830 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
23840 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
23850 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
23860 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
23870 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
23880 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
23890 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
238a0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
238b0 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
238c0 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
238d0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
238e0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
238f0 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
23900 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
23910 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
23920 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
23930 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
23940 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23950 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
23960 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
23970 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
23980 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
23990 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
239a0 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
239b0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
239c0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
239d0 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
239e0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
239f0 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
23a00 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
23a10 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
23a20 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
23a30 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
23a40 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
23a50 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
23a60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
23a70 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23a80 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
23a90 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
23aa0 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
23ab0 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
23ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23ad0 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
23ae0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
23af0 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
23b00 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
23b10 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
23b20 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
23b30 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
23b40 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
23b50 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
23b60 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
23b70 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
23b80 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
23b90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
23ba0 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
23bb0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
23bc0 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
23bd0 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
23be0 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
23bf0 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
23c00 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
23c10 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
23c20 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
23c30 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
23c40 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
23c50 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
23c60 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
23c70 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
23c80 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
23c90 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
23ca0 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
23cb0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
23cc0 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
23cd0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
23ce0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
23cf0 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
23d00 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
23d10 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
23d20 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
23d30 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
23d40 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
23d50 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
23d60 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
23d70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
23d80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
23d90 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
23da0 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
23db0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
23dc0 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
23dd0 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
23de0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23df0 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
23e00 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
23e10 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
23e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23e30 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
23e40 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
23e50 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
23e60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23e70 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
23e80 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
23e90 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
23ea0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
23eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
23ec0 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  EM;.    }..    i
23ed0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23ee0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
23ef0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
23f00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23f10 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
23f20 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
23f30 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
23f40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
23f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23f60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
23f70 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
23f80 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
23f90 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
23fa0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50  = pNew;.      pP
23fb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
23fc0 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
23fd0 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
23fe0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
23ff0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
24000 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eSize;.    }else
24010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
24020 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  ageFree(pNew);. 
24030 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61     }.  }..  *pPa
24040 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
24050 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
24060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24070 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  {.    if( nReser
24080 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
24090 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
240a0 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
240b0 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
240c0 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
240d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
240e0 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
240f0 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
24100 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
24110 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d  );.    pagerFixM
24120 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
24130 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24150 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24160 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
24170 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
24180 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
24190 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
241a0 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
241b0 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
241c0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
241d0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
241e0 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
241f0 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
24200 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
24210 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
24220 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
24230 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
24240 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
24250 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
24260 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
24270 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
24280 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
24290 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
242a0 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
242b0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
242c0 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
242d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
242e0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
242f0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
24300 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
24310 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
24320 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
24330 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
24340 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
24350 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
24360 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
24370 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
24380 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
24390 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
243a0 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
243b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
243c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
243d0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
243e0 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
243f0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
24400 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
24410 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
24420 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
24430 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
24440 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
24450 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
24460 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24470 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
24480 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
24490 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
244a0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
244b0 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
244c0 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
244d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
244e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
244f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
24500 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
24510 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
24520 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
24530 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
24540 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24550 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
24560 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
24570 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
24580 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
24590 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
245a0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
245b0 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
245c0 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
245d0 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
245e0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
245f0 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
24600 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
24610 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
24620 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
24630 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
24640 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
24650 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
24660 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
24670 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24680 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24690 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
246a0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
246b0 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
246c0 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
246d0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
246e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
246f0 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
24700 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
24710 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
24720 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24730 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
24740 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
24750 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
24760 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
24770 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24780 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
24790 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
247a0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
247b0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
247c0 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
247d0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
247e0 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
247f0 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
24800 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
24810 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
24820 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
24830 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
24840 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
24850 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24860 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
24870 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
24880 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
24890 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
248a0 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
248b0 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
248c0 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
248d0 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
248e0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
248f0 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
24900 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
24910 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
24920 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
24930 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
24940 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
24950 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
24960 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
24970 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
24980 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
24990 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
249a0 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
249b0 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
249c0 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
249d0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
249e0 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
249f0 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
24a00 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
24a10 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
24a20 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
24a30 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
24a40 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
24a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24a60 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
24a70 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
24a80 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
24a90 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
24aa0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24ab0 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
24ac0 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
24ad0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
24ae0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
24af0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
24b00 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
24b10 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
24b20 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
24b30 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
24b40 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
24b50 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
24b60 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
24b70 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
24b80 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
24b90 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
24ba0 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
24bb0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
24bc0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
24bd0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
24be0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
24bf0 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
24c00 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
24c10 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
24c20 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
24c30 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
24c40 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
24c50 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
24c60 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
24c70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24c80 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
24c90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24ca0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24cb0 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
24cc0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
24cd0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
24ce0 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
24cf0 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
24d00 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
24d10 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
24d20 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
24d30 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
24d40 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
24d50 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
24d60 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
24d70 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
24d80 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
24d90 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
24da0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24db0 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
24dc0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
24dd0 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
24de0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24df0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
24e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24e10 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
24e20 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
24e30 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
24e40 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
24e50 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
24e60 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
24e70 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
24e80 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
24e90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
24ea0 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
24eb0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
24ec0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
24ed0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
24ee0 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
24ef0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
24f00 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
24f10 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
24f20 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
24f30 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
24f40 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
24f50 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
24f60 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
24f70 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
24f80 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
24f90 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
24fa0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
24fb0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
24fc0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
24fd0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
24fe0 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
24ff0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
25000 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
25010 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
25020 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
25030 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
25040 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
25050 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
25060 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
25070 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
25080 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
25090 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
250a0 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
250b0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
250c0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
250d0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
250e0 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
250f0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
25100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25120 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
25130 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
25140 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
25150 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
25160 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
25170 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
25180 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65  dy held), or one
25190 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
251a0 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
251b0 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
251c0 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
251d0 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
251e0 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
251f0 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
25200 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
25210 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
25220 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
25230 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
25240 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
25250 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
25260 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
25270 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
25280 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
25290 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
252a0 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
252b0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
252c0 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
252d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
252e0 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
252f0 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
25300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
25310 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
25320 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
25330 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
25340 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
25350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
25360 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
25370 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
25380 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
25390 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
253a0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
253b0 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
253c0 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
253d0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
253e0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
253f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
25400 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
25410 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
25420 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
25430 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
25440 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
25450 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
25460 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
25470 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
25480 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
25490 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
254a0 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
254b0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
254c0 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
254d0 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
254e0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
254f0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
25500 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
25510 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
25520 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
25530 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
25540 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
25550 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
25560 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
25570 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
25580 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
25590 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
255a0 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
255b0 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
255c0 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
255d0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
255e0 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
255f0 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
25600 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
25610 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
25620 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
25630 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
25640 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
25650 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
25660 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
25670 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
25680 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
25690 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
256a0 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
256b0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
256c0 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
256d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
256e0 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
256f0 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
25700 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
25710 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
25720 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
25730 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
25740 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
25750 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
25760 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
25770 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
25780 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
25790 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
257a0 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
257b0 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
257c0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
257d0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
257e0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
257f0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25800 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
25810 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
25820 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
25830 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
25840 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
25850 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
25860 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
25870 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
25880 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25890 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
258a0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
258b0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
258c0 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
258d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
258e0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
258f0 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
25900 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
25910 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25920 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
25930 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
25940 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
25950 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
25960 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
25970 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
25980 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
25990 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
259a0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
259b0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
259c0 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
259d0 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
259e0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
259f0 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
25a00 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
25a10 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
25a20 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
25a30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
25a40 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
25a50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
25a60 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74  nly called right
25a70 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
25a80 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
25a90 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66  ..** Once this f
25aa0 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
25ab0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61   called, the tra
25ac0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69  nsaction must ei
25ad0 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65  ther be.** rolle
25ae0 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  d back or commit
25af0 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73  ted. It is not s
25b00 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  afe to call this
25b10 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
25b20 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77   then continue w
25b30 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
25b40 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  tabase..*/.void 
25b50 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
25b60 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
25b70 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
25b80 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
25b90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
25ba0 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
25bb0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25bc0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
25bd0 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
25be0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
25bf0 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f  Page;..  /* At o
25c00 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64  ne point the cod
25c10 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73  e here called as
25c20 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25c30 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a  traint() to.  **
25c40 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
25c50 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75   pages being tru
25c60 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74  ncated away by t
25c70 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72  his operation ar
25c80 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f  e,.  ** if one o
25c90 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
25ca0 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73  s are open, pres
25cb0 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70  ent in the savep
25cc0 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  oint .  ** journ
25cd0 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  al so that they 
25ce0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
25cf0 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  if the savepoint
25d00 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
25d10 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f  back. This is no
25d20 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72   longer necessar
25d30 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  y as this functi
25d40 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20  on is now only. 
25d50 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74   ** called right
25d60 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
25d70 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
25d80 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68  . So although th
25d90 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62  e .  ** Pager ob
25da0 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68  ject may still h
25db0 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ave open savepoi
25dc0 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65  nts (Pager.nSave
25dd0 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a  point!=0), .  **
25de0 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
25df0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20  rolled back. So 
25e00 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  the assertTrunca
25e10 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63  teConstraint() c
25e20 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c  all.  ** is no l
25e30 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a  onger correct. *
25e40 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
25e50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
25e60 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
25e70 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
25e80 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
25e90 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
25ea0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
25eb0 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
25ec0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
25ed0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
25ee0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
25ef0 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
25f00 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
25f10 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
25f20 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
25f30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
25f40 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
25f50 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
25f60 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
25f70 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
25f80 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
25f90 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
25fa0 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
25fb0 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
25fc0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
25fd0 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
25fe0 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
25ff0 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
26000 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
26010 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
26020 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
26030 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
26040 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
26050 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
26060 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
26070 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26080 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
26090 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
260a0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
260b0 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
260c0 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
260d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
260e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
260f0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
26100 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
26110 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
26120 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
26130 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
26140 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
26150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26170 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
26180 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
26190 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
261a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
261b0 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
261c0 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
261d0 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
261e0 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
261f0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
26200 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
26210 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
26220 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
26230 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
26240 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
26250 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
26260 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
26270 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
26280 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
26290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
262a0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
262b0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
262c0 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
262d0 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
262e0 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
262f0 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
26300 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
26310 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
26320 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
26330 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
26340 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
26350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26360 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
26370 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
26380 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
26390 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
263a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
263b0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
263c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
263d0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
263e0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
26410 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
26420 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
26430 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
26440 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
26450 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
26460 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
26470 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
26480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
26490 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
264a0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
264b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
264c0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
264d0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
264e0 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
264f0 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
26500 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26510 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
26520 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
26530 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  0;.    memset(p-
26540 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67  >pExtra, 0, pPag
26550 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d  er->nExtra);.  }
26560 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
26570 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
26580 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
26590 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
265a0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
265b0 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
265c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
265d0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
265e0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
265f0 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
26600 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
26610 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26620 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
26630 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
26640 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
26650 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
26660 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
26670 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
26680 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
26690 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
266a0 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
266b0 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
266c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
266d0 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
266e0 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
266f0 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
26700 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
26710 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
26720 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
26730 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
26740 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
26750 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
26760 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
26770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26780 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  OK;.}../*.** Rel
26790 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
267a0 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50   to page pPg. pP
267b0 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
267c0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
267d0 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  .** earlier call
267e0 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65   to pagerAcquire
267f0 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
26800 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
26810 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67  eleaseMapPage(Pg
26820 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
26830 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
26840 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67  ->pPager;.  pPag
26850 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a  er->nMmapOut--;.
26860 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
26870 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26880 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  elist;.  pPager-
26890 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
268a0 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28   pPg;..  assert(
268b0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
268c0 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
268d0 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  =3 );.  sqlite3O
268e0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
268f0 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e  >fd, (i64)(pPg->
26900 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
26910 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70  pageSize, pPg->p
26920 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
26930 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f  Free all PgHdr o
26940 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e  bjects stored in
26950 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70   the Pager.pMmap
26960 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a  Freelist list..*
26970 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26980 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50  gerFreeMapHdrs(P
26990 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
269a0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48   PgHdr *p;.  PgH
269b0 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  dr *pNext;.  for
269c0 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  (p=pPager->pMmap
269d0 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70  Freelist; p; p=p
269e0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
269f0 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
26a00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26a10 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
26a20 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
26a30 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
26a40 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
26a50 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
26a60 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
26a70 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
26a80 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
26a90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
26aa0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
26ab0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
26ac0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
26ad0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
26ae0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
26af0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
26b00 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
26b10 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
26b20 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
26b30 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
26b40 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
26b50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
26b60 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
26b70 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
26b80 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
26b90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26ba0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
26bb0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
26bc0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
26bd0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
26be0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
26bf0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
26c00 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
26c10 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
26c20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
26c30 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
26c40 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
26c50 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
26c60 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
26c70 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
26c80 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
26c90 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26ca0 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a  u8 *pTmp = (u8 *
26cb0 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
26cc0 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  ce;..  assert( a
26cd0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
26ce0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64  e(pPager) );.  d
26cf0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
26d00 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
26d10 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
26d20 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61  gnMalloc();.  pa
26d30 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70  gerFreeMapHdrs(p
26d40 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61  Pager);.  /* pPa
26d50 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
26d60 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
26d70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
26d80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26d90 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69  _OMIT_WAL.  sqli
26da0 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
26db0 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
26dc0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c  ->ckptSyncFlags,
26dd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
26de0 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67  e, pTmp);.  pPag
26df0 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
26e00 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
26e10 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
26e20 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
26e30 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
26e40 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
26e50 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
26e60 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
26e70 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
26e80 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
26e90 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
26ea0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
26eb0 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
26ec0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
26ed0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
26ee0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
26ef0 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
26f00 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
26f10 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
26f20 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
26f30 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
26f40 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
26f50 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
26f60 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
26f70 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
26f80 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
26f90 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
26fa0 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
26fb0 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
26fc0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
26fd0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
26fe0 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
26ff0 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
27000 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
27010 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
27020 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
27030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
27040 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
27050 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
27060 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
27070 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
27080 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
27090 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
270a0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
270b0 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
270c0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
270d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
270e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
270f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27100 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
27110 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
27120 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
27130 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
27140 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
27150 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
27160 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
27170 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
27180 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
27190 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
271a0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
271b0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
271c0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
271d0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
271e0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
271f0 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
27200 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27210 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
27220 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
27230 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
27240 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
27250 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
27260 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
27270 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
27280 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
27290 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
272a0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
272b0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
272c0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
272d0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
272e0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
272f0 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
27300 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
27310 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
27320 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
27330 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
27340 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
27350 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
27360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27370 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
27380 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
27390 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
273a0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
273b0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
273c0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
273d0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
273e0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
273f0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
27400 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
27410 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
27420 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
27430 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
27440 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
27450 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
27460 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
27470 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
27480 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
27490 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
274a0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
274b0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
274c0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
274d0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
274e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
274f0 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
27500 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
27510 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
27520 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
27530 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
27540 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
27550 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27560 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
27570 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
27580 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
27590 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
275a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
275b0 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
275c0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
275d0 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
275e0 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
275f0 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
27600 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
27610 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
27620 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
27630 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
27640 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
27650 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
27660 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
27670 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
27680 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
27690 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
276a0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
276b0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
276c0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
276d0 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
276e0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
276f0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
27700 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
27710 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
27720 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
27730 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
27740 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
27750 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
27760 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
27770 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
27780 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
27790 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
277a0 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
277b0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
277c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
277d0 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
277e0 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
277f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
27800 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
27810 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
27820 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
27830 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
27840 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
27850 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
27860 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
27870 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
27880 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
27890 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
278a0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
278b0 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
278c0 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
278d0 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
278e0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
278f0 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
27900 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
27910 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
27920 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
27930 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
27940 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
27950 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
27960 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
27970 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
27980 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
27990 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
279a0 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
279b0 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
279c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
279d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
279e0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
279f0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
27a00 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
27a10 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
27a20 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
27a30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
27a40 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
27a50 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
27a60 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27a90 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
27aa0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
27ab0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
27ac0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
27ad0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
27ae0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
27af0 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
27b00 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
27b10 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
27b20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
27b30 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
27b40 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
27b50 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
27b60 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
27b70 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27b80 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
27b90 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
27ba0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
27bb0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27bc0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
27bd0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
27be0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
27bf0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
27c00 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
27c10 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
27c20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
27c30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
27c40 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
27c50 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
27c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
27c70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27c80 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
27c90 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
27ca0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
27cb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
27cc0 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
27cd0 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
27ce0 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
27cf0 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
27d00 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
27d10 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
27d20 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
27d30 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
27d40 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
27d50 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
27d60 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
27d70 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
27d80 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
27d90 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
27da0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
27db0 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
27dc0 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
27dd0 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
27de0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
27df0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
27e00 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
27e10 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
27e20 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
27e30 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
27e40 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63  ection's transac
27e50 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
27e60 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
27e70 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
27e80 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
27e90 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
27ea0 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
27eb0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
27ec0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
27ed0 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
27ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
27ef0 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
27f00 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
27f10 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
27f20 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
27f30 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
27f40 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
27f50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
27f60 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
27f70 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
27f80 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
27f90 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
27fa0 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
27fb0 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
27fc0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
27fd0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
27fe0 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
27ff0 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
28000 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
28010 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
28020 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
28030 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
28040 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
28050 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
28060 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
28070 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
28080 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
28090 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
280a0 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
280b0 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
280c0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
280d0 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
280e0 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
280f0 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
28100 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
28110 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28120 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
28130 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
28140 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
28150 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
28160 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
28170 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
28180 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
28190 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
281a0 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
281b0 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
281c0 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
281d0 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
281e0 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
281f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
28200 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
28210 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
28220 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
28230 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
28240 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
28250 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  c[8];.        u8
28260 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
28270 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
28280 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ];..        memc
28290 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
282a0 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
282b0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
282c0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  );.        put32
282d0 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
282e0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
282f0 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
28300 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
28310 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
28320 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
28330 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
28340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
28350 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
28360 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
28370 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
28380 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28390 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
283a0 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
283b0 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
283c0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
283d0 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
283e0 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
283f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28400 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
28410 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
28420 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
28430 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
28440 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28450 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
28460 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
28470 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
28480 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28490 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
284a0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
284b0 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
284c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
284d0 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
284e0 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
284f0 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
28500 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
28510 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
28520 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
28530 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
28540 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
28550 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
28560 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
28570 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
28580 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
28590 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
285a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
285b0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
285c0 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
285d0 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
285e0 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
285f0 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
28600 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
28610 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
28620 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
28630 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
28640 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
28650 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
28660 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
28670 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
28680 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
28690 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
286a0 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
286b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
286c0 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
286d0 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
286e0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
286f0 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
28700 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
28710 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
28720 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
28730 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
28740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
28750 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
28760 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
28770 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
28780 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
28790 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
287a0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
287b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
287c0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
287d0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
287e0 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
287f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28800 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28810 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
28820 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
28830 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e  ("JHDR %p %lld\n
28840 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
28850 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b  r->journalHdr));
28860 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28870 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20  lite3OsWrite(.  
28880 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
28890 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
288a0 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
288b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
288c0 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Hdr.        );. 
288d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
288e0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
288f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
28900 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
28910 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
28920 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
28930 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28940 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
28950 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28960 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
28970 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28980 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
28990 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
289a0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
289b0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
289c0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20  r->syncFlags| . 
289d0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
289e0 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c  ->syncFlags==SQL
289f0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
28a00 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
28a10 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
28a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28a40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28a50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
28a60 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
28a70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
28a80 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
28a90 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
28aa0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
28ab0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
28ac0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
28ad0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
28ae0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
28af0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
28b00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28b10 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28b30 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
28b40 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
28b50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28b60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28b70 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
28b80 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
28b90 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
28ba0 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
28bb0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
28bc0 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
28bd0 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
28be0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28bf0 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
28c00 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
28c10 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
28c20 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
28c30 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
28c40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
28c50 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
28c60 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
28c70 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
28c80 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
28c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28ca0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
28cb0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
28cc0 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
28cd0 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
28ce0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
28cf0 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
28d00 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
28d10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
28d20 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
28d30 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
28d40 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
28d50 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
28d60 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
28d70 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
28d80 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
28d90 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
28da0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
28db0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
28dc0 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
28dd0 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
28de0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
28df0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
28e00 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
28e10 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
28e20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
28e30 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
28e40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
28e50 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
28e60 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
28e70 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
28e80 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
28e90 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
28ea0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
28eb0 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
28ec0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
28ed0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28ee0 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
28ef0 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
28f00 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
28f10 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
28f20 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
28f30 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
28f40 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
28f50 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
28f60 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
28f70 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
28f80 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
28f90 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
28fa0 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
28fb0 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
28fc0 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
28fd0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
28fe0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
28ff0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
29000 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
29010 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
29020 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
29030 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
29040 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
29050 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
29060 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
29070 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
29080 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
29090 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
290a0 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
290b0 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
290c0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
290d0 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
290e0 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
290f0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
29100 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
29110 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
29120 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
29130 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
29140 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
29150 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
29160 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
29170 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
29180 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
29190 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
291a0 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
291b0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
291c0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
291d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
291e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
291f0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
29200 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
29210 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
29220 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
29230 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
29240 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
29250 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
29260 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
29270 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
29280 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
29290 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
292a0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
292b0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
292c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
292e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
292f0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
29300 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
29310 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  led for rollback
29320 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45   pagers in WRITE
29330 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a  R_DBMOD state. *
29340 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
29350 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
29360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29370 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29380 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
29390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
293a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
293b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
293c0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
293d0 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
293e0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
293f0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
29400 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
29410 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
29420 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
29430 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
29440 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
29450 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
29460 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
29470 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
29480 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
29490 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
294a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
294b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
294c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
294d0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
294e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
294f0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
29500 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
29510 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
29520 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
29530 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69  re the first wri
29540 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53  te, give the VFS
29550 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20   a hint of what 
29560 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66  the final.  ** f
29570 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  ile size will be
29580 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
29590 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
295a0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
295b0 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63  >fd) );.  if( rc
295c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
295d0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  && pPager->dbHin
295e0 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  tSize<pPager->db
295f0 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73  Size.   && (pLis
29600 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69  t->pDirty || pLi
29610 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  st->pgno>pPager-
29620 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29  >dbHintSize).  )
29630 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
29640 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61  t64 szFile = pPa
29650 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  ger->pageSize * 
29660 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
29670 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
29680 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
29690 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
296a0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
296b0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
296c0 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
296d0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
296e0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
296f0 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
29700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29710 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
29720 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
29730 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
29740 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
29750 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
29760 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
29770 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
29780 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
29790 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
297a0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
297b0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
297c0 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
297d0 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
297e0 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
297f0 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
29800 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
29810 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
29820 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
29830 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
29840 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
29850 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
29860 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
29870 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
29880 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
29890 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
298a0 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
298b0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
298c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
298d0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
298e0 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
298f0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
29900 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
29910 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
29920 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
29930 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
29940 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
29950 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
29960 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
29970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29990 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
299a0 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
299b0 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
299c0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
299d0 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
299e0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
299f0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
29a00 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
29a10 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  List);..      /*
29a20 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
29a30 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
29a40 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
29a50 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
29a60 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
29a70 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
29a80 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
29a90 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
29aa0 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
29ab0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
29ac0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
29ad0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
29ae0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
29af0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
29b00 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
29b10 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
29b20 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
29b30 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
29b40 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
29b50 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
29b60 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
29b70 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
29b80 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
29b90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29ba0 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
29bb0 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
29bc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
29bd0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
29be0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
29bf0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
29c00 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
29c10 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
29c20 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
29c30 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
29c40 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
29c50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
29c60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
29c70 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
29c80 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
29c90 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
29ca0 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
29cb0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
29cc0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
29cd0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
29ce0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
29cf0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
29d00 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
29d10 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
29d20 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
29d30 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
29d40 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
29d50 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
29d60 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
29d90 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
29da0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
29db0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
29dc0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
29dd0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
29de0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
29df0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
29e00 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
29e10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29e20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
29e30 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
29e40 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29e50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
29e60 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
29e70 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
29e80 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
29e90 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
29ea0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
29eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
29ec0 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
29ed0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
29ee0 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
29ef0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
29f00 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
29f10 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
29f20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29f30 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
29f40 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
29f50 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
29f60 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
29f70 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
29f80 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
29f90 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
29fa0 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
29fb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29fc0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
29fd0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29fe0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29ff0 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
2a000 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a010 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
2a020 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2a030 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a040 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
2a050 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
2a060 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
2a070 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
2a080 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
2a090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a0a0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
2a0b0 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
2a0c0 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45  er->sjfd, SQLITE
2a0d0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2a0e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2a0f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a100 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f  ** Append a reco
2a110 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  rd of the curren
2a120 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20  t state of page 
2a130 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  pPg to the sub-j
2a140 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69  ournal. .** It i
2a150 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
2a160 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20  sponsibility to 
2a170 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65 73  use subjRequires
2a180 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20  Page() to check 
2a190 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 72  .** that it is r
2a1a0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62  eally required b
2a1b0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
2a1c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
2a1d0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2a1e0 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f  , set the bit co
2a1f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2a200 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20  Pg->pgno in the 
2a210 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61  bitvecs.** for a
2a220 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
2a230 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ts before return
2a240 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
2a250 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2a260 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
2a270 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2a280 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a  essful, an IO.**
2a290 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2a2a0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
2a2b0 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ite to the sub-j
2a2c0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
2a2d0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2a2e0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
2a2f0 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e  ils while settin
2a300 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76  g a bit in a sav
2a310 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63  epoint.** bitvec
2a320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a330 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50  subjournalPage(P
2a340 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
2a350 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a360 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2a370 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2a380 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
2a390 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2a3a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2a3b0 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  F ){..    /* Ope
2a3c0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2a3d0 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  l, if it has not
2a3e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
2a3f0 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65  ened */.    asse
2a400 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2a410 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
2a420 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2a430 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67  ger->jfd) || pag
2a440 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2a450 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a460 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2a470 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2a480 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20  nSubRec==0 );.  
2a490 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
2a4a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20  seWal(pPager) . 
2a4b0 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
2a4c0 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
2a4d0 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20   pPg) .         
2a4e0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2a4f0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2a500 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2a510 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2a520 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2a530 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2a540 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2a550 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2a560 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2a570 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2a580 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2a590 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2a5a0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2a5b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a5c0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2a5d0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2a5e0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2a5f0 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2a600 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2a610 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2a620 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2a630 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
2a640 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
2a650 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
2a660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a670 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
2a680 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a690 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
2a6a0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2a6b0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2a6c0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
2a6d0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2a6e0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
2a6f0 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
2a700 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2a710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a720 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a730 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2a740 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
2a750 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2a760 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
2a770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2a780 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a790 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2a7a0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
2a7b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a7c0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
2a7d0 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
2a7e0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2a7f0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2a800 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2a810 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2a820 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2a830 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2a840 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2a850 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2a860 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2a870 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2a880 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2a890 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2a8a0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2a8b0 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2a8c0 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2a8d0 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2a8e0 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2a8f0 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2a900 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2a910 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2a920 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2a930 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2a940 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2a950 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2a960 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2a970 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2a980 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2a990 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2a9a0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2a9b0 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2a9c0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2a9d0 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2a9e0 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2a9f0 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2aa00 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2aa10 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2aa20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2aa30 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2aa40 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2aa50 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2aa60 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2aa70 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2aa80 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2aa90 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2aaa0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2aab0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2aac0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2aad0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2aae0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2aaf0 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2ab00 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2ab10 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2ab20 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2ab30 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2ab40 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2ab50 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2ab60 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2ab70 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2ab80 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2ab90 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2aba0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2abb0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2abc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2abd0 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2abe0 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2abf0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2ac00 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2ac10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ac20 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2ac30 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2ac40 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2ac50 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2ac60 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2ac70 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
2ac80 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20  SYNC bit is set 
2ac90 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
2aca0 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
2acb0 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
2acc0 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
2acd0 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
2ace0 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
2acf0 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
2ad00 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
2ad10 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
2ad20 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
2ad30 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
2ad40 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
2ad50 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
2ad60 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
2ad70 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
2ad80 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f  l ROLLBACK and O
2ad90 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73  FF bits inhibits
2ada0 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2adb0 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c  ing.  ** regardl
2adc0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2add0 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2ade0 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2adf0 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20  is set during.  
2ae00 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ** a rollback or
2ae10 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74   by user request
2ae20 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
2ae30 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2ae40 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2ae50 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2ae60 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2ae70 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2ae80 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2ae90 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2aea0 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2aeb0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2aec0 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
2aed0 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
2aee0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2aef0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
2af00 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a  h createFlag==3.
2af10 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
2af20 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
2af30 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
2af40 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
2af50 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
2af60 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
2af70 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
2af80 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
2af90 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
2afa0 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
2afb0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2afc0 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
2afd0 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
2afe0 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
2aff0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2b000 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2b010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65   SQLITE_OK;.  te
2b020 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2b030 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2b040 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
2b050 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2b060 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b070 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  l & SPILLFLAG_OF
2b080 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  F );.  testcase(
2b090 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2b0a0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2b0b0 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20  NOSYNC );.  if( 
2b0c0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b0d0 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65  ll.   && ((pPage
2b0e0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2b0f0 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  (SPILLFLAG_ROLLB
2b100 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  ACK|SPILLFLAG_OF
2b110 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20  F))!=0.      || 
2b120 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
2b130 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
2b140 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2b150 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b160 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
2b170 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2b180 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2b190 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
2b1a0 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
2b1b0 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
2b1c0 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
2b1d0 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2b1e0 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20  Page(pPg) ){ .  
2b1f0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2b200 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20  nalPage(pPg); . 
2b210 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2b220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b230 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
2b240 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
2b250 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pPg, 0, 0);.    
2b260 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
2b270 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
2b280 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
2b290 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
2b2a0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
2b2b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20  HDR_NEED_SYNC . 
2b2c0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
2b2d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
2b2e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
2b2f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b300 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
2b310 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  r, 1);.    }.  .
2b320 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
2b330 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69  ge number of thi
2b340 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72  s page is larger
2b350 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
2b360 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  t size of.    **
2b370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
2b380 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
2b390 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
2b3a0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2b3b0 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  l..    ** This i
2b3c0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
2b3d0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
2b3e0 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
2b3f0 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
2b400 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
2b410 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
2b420 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
2b430 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
2b440 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
2b450 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  owing sequence o
2b460 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a  f events:.    **
2b470 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  .    **   BEGIN;
2b480 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  .    **     <jou
2b490 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20  rnal page X>.   
2b4a0 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
2b4b0 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
2b4c0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
2b4d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  .    **       <s
2b4e0 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
2b4f0 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
2b500 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67      **       pag
2b510 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
2b520 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  .    **     ROLL
2b530 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20  BACK TO sp;.    
2b540 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e  **.    ** If (X>
2b550 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
2b560 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
2b570 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
2b580 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
2b590 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65     ** out to the
2b5a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2b5b0 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70  but will be drop
2b5c0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ped from the cac
2b5d0 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a  he. Then,.    **
2b5e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
2b5f0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
2b600 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
2b610 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
2b620 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ead.    ** data 
2b630 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2b640 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
2b650 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
2b660 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
2b670 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
2b680 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
2b690 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
2b6a0 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
2b6b0 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20  OINT sp".    ** 
2b6c0 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
2b6d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2b6e0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77  solution is to w
2b6f0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
2b700 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58   data for page X
2b710 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
2b720 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
2b730 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
2b740 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
2b750 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
2b760 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
2b770 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63  estored to its c
2b780 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65  urrent value whe
2b790 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
2b7a0 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a  TO sp" is .    *
2b7b0 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  * executed..    
2b7c0 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
2b7d0 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  (.        rc==SQ
2b7e0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
2b7f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
2b800 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
2b810 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
2b820 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
2b830 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2b840 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  pPg);.    }.  . 
2b850 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2b860 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b870 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
2b880 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2b890 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b8a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b8b0 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
2b8c0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2b8d0 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
2b8e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2b8f0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
2b900 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a  er, pPg);.    }.
2b910 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
2b920 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
2b930 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2b940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b950 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
2b960 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
2b970 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2b980 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2b990 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2b9a0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
2b9b0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2b9c0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
2b9d0 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a  er, rc); .}.../*
2b9e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
2b9f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2ba00 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
2ba10 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
2ba20 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
2ba30 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
2ba40 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
2ba50 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2ba60 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2ba70 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2ba80 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2ba90 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2baa0 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2bab0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bac0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2bad0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2bae0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2baf0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2bb00 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2bb10 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2bb20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2bb30 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2bb40 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2bb50 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2bb60 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2bb70 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2bb80 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2bb90 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2bba0 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2bbb0 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2bbc0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2bbd0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2bbe0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2bbf0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2bc00 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2bc10 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2bc20 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2bc30 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2bc40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2bc50 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2bc60 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2bc70 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2bc80 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2bc90 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2bca0 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2bcb0 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2bcc0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2bcd0 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
2bce0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2bcf0 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
2bd00 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
2bd10 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
2bd20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
2bd30 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
2bd40 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
2bd50 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
2bd60 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
2bd70 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a  AGER_* flags..**
2bd80 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
2bd90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
2bda0 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
2bdb0 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
2bdc0 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
2bdd0 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
2bde0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
2bdf0 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
2be00 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
2be10 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
2be20 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2be30 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
2be40 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
2be50 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2be60 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2be70 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2be80 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
2be90 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
2bea0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2beb0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2bec0 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
2bed0 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
2bee0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2bef0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2bf00 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2bf10 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
2bf20 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
2bf30 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
2bf40 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
2bf50 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
2bf60 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
2bf70 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
2bf80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2bf90 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
2bfa0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2bfb0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2bfc0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
2bfd0 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
2bfe0 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
2bff0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2c000 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
2c010 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2c020 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2c030 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
2c040 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2c050 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2c060 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
2c070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c080 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
2c090 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
2c0a0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2c0b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2c0c0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2c0d0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
2c0e0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
2c0f0 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
2c100 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
2c110 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
2c120 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
2c130 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
2c140 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
2c150 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
2c160 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
2c170 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
2c180 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
2c190 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
2c1a0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2c1b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
2c1c0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
2c1d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c1e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2c1f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
2c200 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
2c210 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
2c220 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
2c230 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2c240 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
2c250 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2c260 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2c270 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2c280 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
2c290 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2c2a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2c2b0 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2c2c0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2c2d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2c2e0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2c2f0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2c300 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2c310 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2c320 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2c330 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2c340 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2c350 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2c360 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2c370 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2c380 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2c390 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2c3a0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2c3b0 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2c3c0 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2c3d0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2c3e0 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2c3f0 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2c400 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2c410 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2c420 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2c430 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2c440 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2c450 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2c460 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2c470 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c480 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2c490 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2c4a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2c4b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2c4c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2c4d0 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2c4e0 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2c4f0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2c500 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2c510 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2c520 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2c530 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2c540 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2c550 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2c560 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2c570 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a  rnal). This.  **
2c580 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2c590 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
2c5a0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2c5b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2c5c0 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20  dle .  ** and a 
2c5d0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
2c5e0 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74  file-handle. Not
2c5f0 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61  e that a "regula
2c600 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65  r journal-handle
2c610 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  ".  ** may be a 
2c620 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20  wrapper capable 
2c630 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66  of caching the f
2c640 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20  irst portion of 
2c650 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
2c660 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20   file in memory 
2c670 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2c680 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2c690 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20  timization (see 
2c6a0 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  .  ** source fil
2c6b0 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20  e journal.c)..  
2c6c0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2c6d0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2c6e0 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
2c6f0 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
2c700 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c710 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2c720 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2c730 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
2c740 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2c750 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2c760 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2c770 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ());.  }..  /* S
2c780 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
2c790 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
2c7a0 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
2c7b0 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
2c7c0 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e  Pager = 0;..#ifn
2c7d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c7e0 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66  MEMORYDB.  if( f
2c7f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d  lags & PAGER_MEM
2c800 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62  ORY ){.    memDb
2c810 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46   = 1;.    if( zF
2c820 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2c830 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  name[0] ){.     
2c840 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2c850 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
2c860 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2c870 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2c880 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0  ) return SQL
2c890 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2c8a0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2c8b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2c8c0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2c8d0 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2c8e0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2c8f0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2c900 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2c910 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2c920 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2c930 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2c940 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2c950 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2c960 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2c970 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2c980 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2c990 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2c9a0 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2c9b0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2c9c0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2c9d0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2c9e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2c9f0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2ca00 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2ca10 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2ca20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2ca30 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2ca40 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2ca50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2ca60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ca70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2ca80 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2ca90 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2caa0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2cab0 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2cac0 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2cad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2cae0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2caf0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2cb00 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2cb10 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2cb20 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2cb30 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2cb40 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2cb50 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2cb60 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2cb70 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2cb80 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2cb90 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2cba0 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2cbb0 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2cbc0 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2cbd0 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2cbe0 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2cbf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2cc00 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2cc10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cc20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2cc30 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2cc40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2cc50 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2cc60 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2cc70 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2cc80 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2cc90 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2cca0 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2ccb0 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2ccc0 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2ccd0 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2cce0 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2ccf0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2cd00 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2cd10 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2cd20 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2cd30 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2cd40 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2cd50 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2cd60 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2cd70 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2cd80 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2cd90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2cda0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2cdb0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2cdc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cdd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2cde0 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2cdf0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ce00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ce10 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2ce20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2ce30 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2ce40 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2ce50 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2ce60 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2ce70 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2ce80 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2ce90 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2cea0 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2ceb0 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2cec0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2ced0 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cef0 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2cf00 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2cf10 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf30 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2cf40 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2cf50 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2cf60 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2cf70 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2cf80 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2cf90 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2cfa0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2cfb0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2cfc0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2cfd0 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2cfe0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2cff0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2d000 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2d010 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2d020 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2d030 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2d040 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2d050 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2d060 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2d070 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2d080 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2d090 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2d0a0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2d0b0 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2d0c0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2d0d0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2d0e0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2d0f0 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2d100 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2d110 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2d120 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2d130 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2d140 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2d150 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2d160 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d170 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2d180 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2d190 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2d1a0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2d1b0 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2d1c0 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2d1d0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2d1e0 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2d1f0 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2d200 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2d210 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2d220 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2d230 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2d240 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2d250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2d260 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2d270 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2d280 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2d290 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2d2a0 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2d2b0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2d2c0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2d2d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d2e0 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
2d2f0 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2d300 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2d310 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2d320 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2d330 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2d340 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2d350 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2d360 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2d370 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d380 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2d390 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2d3a0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d3b0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d3c0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2d3d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2d3e0 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2d3f0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2d400 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2d410 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d420 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2d430 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2d440 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2d450 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2d460 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2d470 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2d480 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2d490 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2d4a0 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2d4b0 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2d4c0 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2d4d0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2d4e0 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2d4f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2d500 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2d510 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2d520 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2d530 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2d540 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d550 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d560 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2d570 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2d580 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d590 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2d5a0 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2d5b0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2d5c0 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2d5d0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2d5e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2d5f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d600 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2d610 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2d620 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2d630 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2d640 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d650 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2d660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d670 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2d680 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2d690 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2d6a0 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2d6b0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2d6c0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2d6d0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2d6e0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2d6f0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2d700 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2d710 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2d720 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2d730 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d740 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2d750 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d760 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2d770 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2d780 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2d790 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2d7a0 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2d7b0 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2d7c0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2d7d0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2d7e0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2d7f0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d810 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2d820 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2d830 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2d840 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2d850 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2d860 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2d870 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2d880 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2d890 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2d8a0 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2d8b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2d8c0 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2d8d0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2d8e0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2d8f0 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2d900 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2d910 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2d920 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2d930 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2d940 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2d950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d960 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2d970 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2d980 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2d990 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2d9a0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2d9b0 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2d9c0 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2d9d0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2d9e0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2d9f0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2da00 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2da10 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2da20 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2da30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2da40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2da50 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
2da60 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2da70 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2da80 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2da90 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20    if( !readOnly 
2daa0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65  ){.        setSe
2dab0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2dac0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2dad0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2dae0 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2daf0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2db00 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2db10 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
2db20 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
2db30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2db40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2db50 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2db60 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2db70 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2db80 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2db90 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2dba0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2dbb0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2dbc0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2dbd0 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50  geDflt = (u32)pP
2dbe0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2dbf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2dc00 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2dc10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2dc20 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2dc30 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
2dc40 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
2dc50 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2dc60 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2dc70 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2dc80 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2dc90 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
2dca0 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
2dcb0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2dcc0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
2dcd0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
2dce0 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
2dcf0 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
2dd00 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
2dd10 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2dd20 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2dd40 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
2dd50 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
2dd60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2dd70 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2dd80 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ii;.            
2dd90 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2dda0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2ddb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
2ddc0 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71  ger->noLock = sq
2ddd0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2dde0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f  n(zFilename, "no
2ddf0 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20  lock", 0);.     
2de00 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49   if( (iDc & SQLI
2de10 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42  TE_IOCAP_IMMUTAB
2de20 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  LE)!=0.       ||
2de30 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2de40 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2de50 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20  "immutable", 0) 
2de60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73  ){.          vfs
2de70 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2de80 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2de90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63           goto ac
2dea0 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2deb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2dec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2ded0 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2dee0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2def0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2df00 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2df10 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2df20 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2df30 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2df40 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2df50 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2df60 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2df70 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2df80 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2df90 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2dfa0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2dfb0 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2dfc0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2dfd0 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2dfe0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2dff0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2e000 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2e010 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2e020 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2e030 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2e040 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2e050 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2e060 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2e070 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20  ranch also runs 
2e080 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64  for files marked
2e090 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20   as immutable.. 
2e0a0 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f     */ .act_like_
2e0b0 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74  temp_file:.    t
2e0c0 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
2e0d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2e0e0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20  = PAGER_READER; 
2e0f0 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2e100 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
2e110 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61   lock */.    pPa
2e120 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2e130 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20  LUSIVE_LOCK;    
2e140 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72  /* Pretend we ar
2e150 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e in EXCLUSIVE l
2e160 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 2a 2f 0a 20  ocking mode */. 
2e170 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63     pPager->noLoc
2e180 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  k = 1;          
2e190 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c        /* Do no l
2e1a0 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65  ocking */.    re
2e1b0 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
2e1c0 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
2e1d0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
2e1e0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
2e1f0 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
2e200 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
2e210 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
2e220 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
2e230 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
2e240 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
2e250 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
2e260 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
2e270 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e280 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2e290 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
2e2a0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
2e2b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
2e2c0 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
2e2d0 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
2e2e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
2e2f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2e300 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
2e310 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
2e320 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20  bject. */.  if( 
2e330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e340 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78  .    assert( nEx
2e350 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  tra<1000 );.    
2e360 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2e370 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 72 63 20  nExtra);.    rc 
2e380 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f  = sqlite3PcacheO
2e390 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
2e3a0 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3c0 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2e3d0 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2e3e0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2e3f0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2e400 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2e410 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2e420 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  d above, free th
2e430 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75  e  Pager structu
2e440 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2e450 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2e460 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e470 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
2e480 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2e490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2e4a0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
2e4b0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73  TmpSpace);.    s
2e4c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2e4d0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2e4e0 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
2e4f0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2e500 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2e510 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2e520 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e530 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2e540 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2e550 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2e560 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2e570 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2e580 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2e590 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2e5a0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2e5b0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e5c0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2e5d0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2e5e0 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2e5f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2e600 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e610 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2e620 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e630 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2e640 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2e650 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2e660 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2e670 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2e680 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2e690 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e6a0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
2e6b0 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
2e6c0 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
2e6d0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
2e6e0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2e6f0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2e700 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
2e710 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2e720 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2e730 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2e740 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2e750 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
2e760 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
2e770 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
2e780 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
2e790 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2e7a0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
2e7b0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2e7c0 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
2e7d0 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
2e7e0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
2e7f0 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
2e800 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
2e810 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
2e820 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
2e830 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
2e840 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66  ->tempFile;.  if
2e850 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2e860 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e870 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2e880 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e890 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  t( pPager->syncF
2e8a0 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2e8b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77  ssert( pPager->w
2e8c0 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  alSyncFlags==0 )
2e8d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e8e0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2e8f0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ags==0 );.  }els
2e900 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  e{.    pPager->f
2e910 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  ullSync = 1;.   
2e920 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2e930 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2e940 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
2e950 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
2e960 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2e970 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e  NORMAL | WAL_SYN
2e980 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a  C_TRANSACTIONS;.
2e990 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
2e9a0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
2e9b0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2e9c0 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2e9d0 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
2e9e0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2e9f0 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
2ea00 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2ea10 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
2ea20 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
2ea30 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70  (u16)nExtra;.  p
2ea40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
2ea50 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
2ea60 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
2ea70 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
2ea80 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2ea90 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
2eaa0 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
2eab0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2eac0 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72  ;.  if( !useJour
2ead0 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  nal ){.    pPage
2eae0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2eaf0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2eb00 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20  DE_OFF;.  }else 
2eb10 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
2eb20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2eb30 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2eb40 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
2eb50 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
2eb60 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
2eb70 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2eb80 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
2eb90 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Arg = 0; */.  pP
2eba0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
2ebb0 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20  = xReinit;.  /* 
2ebc0 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
2ebd0 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2ebe0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
2ebf0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ec00 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45  >szMmap = SQLITE
2ec10 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
2ec20 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65  ZE // will be se
2ec30 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a  t by btree.c */.
2ec40 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
2ec50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
2ec60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
2ec70 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
2ec80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
2ec90 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65  as not be delete
2eca0 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74  d or renamed out
2ecb0 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74   from.** under t
2ecc0 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  he pager.  Retur
2ecd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
2ece0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
2ecf0 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67  till were it oug
2ed00 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64  ht.** to be on d
2ed10 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  isk.  Return non
2ed20 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45  -zero (SQLITE_RE
2ed30 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f  ADONLY_DBMOVED o
2ed40 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
2ed50 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20  or.** code from 
2ed60 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2ed70 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  )) if the databa
2ed80 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73  se has gone miss
2ed90 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2eda0 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d  nt databaseIsUnm
2edb0 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  oved(Pager *pPag
2edc0 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d  er){.  int bHasM
2edd0 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  oved = 0;.  int 
2ede0 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
2edf0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65  r->tempFile ) re
2ee00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ee10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2ee20 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Size==0 ) return
2ee30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2ee40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46  sert( pPager->zF
2ee50 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65  ilename && pPage
2ee60 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  r->zFilename[0] 
2ee70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2ee80 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
2ee90 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
2eea0 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
2eeb0 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a  D, &bHasMoved);.
2eec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2eed0 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
2eee0 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d   /* If the HAS_M
2eef0 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  OVED file-contro
2ef00 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74  l is unimplement
2ef10 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ed, assume that 
2ef20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
2ef30 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76  has not been mov
2ef40 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65  ed.  That is the
2ef50 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61   historical beha
2ef60 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20  vior of SQLite: 
2ef70 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
2ef80 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69  version 3.8.3, i
2ef90 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20  t never checked 
2efa0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
2efb0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
2efc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2efd0 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b   && bHasMoved ){
2efe0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2eff0 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
2f000 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
2f010 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
2f020 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2f030 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
2f040 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
2f050 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
2f060 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
2f070 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
2f080 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
2f090 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
2f0a0 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
2f0b0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
2f0c0 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
2f0d0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
2f0e0 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
2f0f0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2f100 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
2f110 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2f120 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
2f130 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
2f140 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2f150 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
2f160 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
2f170 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f180 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
2f190 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
2f1a0 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
2f1b0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
2f1c0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2f1d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f1e0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2f1f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2f200 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
2f210 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
2f220 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
2f230 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
2f240 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2f250 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2f260 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
2f270 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
2f280 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
2f290 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
2f2a0 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
2f2b0 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
2f2c0 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
2f2d0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
2f2e0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
2f2f0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
2f300 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2f310 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
2f320 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2f330 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
2f340 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
2f350 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
2f360 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
2f370 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2f380 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2f390 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2f3a0 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
2f3b0 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
2f3c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
2f3d0 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
2f3e0 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
2f3f0 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
2f400 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
2f410 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
2f420 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
2f430 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f440 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2f450 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
2f460 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2f470 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
2f480 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
2f490 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
2f4a0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
2f4b0 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
2f4c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f4d0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2f4e0 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
2f4f0 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
2f500 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
2f510 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2f520 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
2f530 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
2f540 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
2f550 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2f560 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
2f570 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2f580 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
2f590 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
2f5a0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2f5b0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2f5c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2f5d0 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
2f5e0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2f5f0 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
2f600 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2f610 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
2f620 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
2f630 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2f640 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
2f650 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
2f660 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
2f670 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
2f680 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
2f690 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
2f6a0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2f6b0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2f6c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2f6d0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2f6e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2f6f0 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
2f700 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2f710 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2f720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f730 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
2f740 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
2f750 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2f760 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
2f770 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2f780 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
2f790 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2f7a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2f7b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2f7c0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
2f7d0 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
2f7e0 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
2f7f0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2f800 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2f810 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
2f820 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
2f830 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
2f840 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
2f850 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
2f860 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
2f870 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2f880 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2f890 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2f8a0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2f8b0 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
2f8c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f8d0 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
2f8e0 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
2f8f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f900 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
2f910 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2f920 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
2f930 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
2f940 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
2f950 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2f960 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
2f970 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
2f980 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2f990 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
2f9a0 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
2f9b0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2f9c0 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
2f9d0 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
2f9e0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2f9f0 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
2fa00 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
2fa10 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
2fa20 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
2fa30 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2fa40 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
2fa50 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
2fa60 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
2fa70 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
2fa80 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
2fa90 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
2faa0 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
2fab0 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
2fac0 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
2fad0 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
2fae0 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
2faf0 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
2fb00 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
2fb10 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
2fb20 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
2fb30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2fb40 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2fb50 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
2fb60 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
2fb70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2fb80 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
2fb90 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
2fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fbb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2fbc0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2fbd0 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  le */..      rc 
2fbe0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
2fbf0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2fc00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2fc10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fc20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
2fc30 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20  atabase is zero 
2fc40 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  pages in size, t
2fc50 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65  hat means that e
2fc60 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20  ither (1) the.  
2fc70 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
2fc80 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72   is a remnant fr
2fc90 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62  om a prior datab
2fca0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
2fcb0 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20  e name where.   
2fcc0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2fcd0 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f  base file but no
2fce0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  t the journal wa
2fcf0 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32  s deleted, or (2
2fd00 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20  ) the initial.  
2fd10 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
2fd20 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61  tion that popula
2fd30 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61  tes a new databa
2fd40 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  se is being roll
2fd50 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ed back..       
2fd60 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61   ** In either ca
2fd70 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  se, the journal 
2fd80 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65  file can be dele
2fd90 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74  ted.  However, t
2fda0 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20  ake care.       
2fdb0 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74   ** not to delet
2fdc0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2fdd0 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  le if it is alre
2fde0 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a  ady open due to.
2fdf0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
2fe00 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e  al_mode=PERSIST.
2fe10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fe20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2fe30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b   && !jrnlOpen ){
2fe40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fe50 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2fe60 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
2fe70 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
2fe80 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
2fe90 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
2fea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2feb0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2fec0 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
2fed0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
2fee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2fef0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2ff00 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f  Mode ) pagerUnlo
2ff10 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
2ff20 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2ff30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ff40 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
2ff50 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2ff60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ff70 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
2ff80 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2ff90 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
2ffa0 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
2ffb0 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
2ffc0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
2ffd0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2ffe0 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
2fff0 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
30000 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
30010 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
30020 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
30030 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
30040 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
30050 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
30060 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
30070 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
30080 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
30090 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
300a0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
300b0 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
300c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
300d0 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
300e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
300f0 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
30100 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
30110 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
30120 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
30130 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
30140 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
30150 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
30160 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
30170 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30180 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
301a0 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
301b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
301c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
301d0 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
301e0 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
301f0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
30200 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30210 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
30220 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
30230 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30240 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
30250 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
30260 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
30270 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30280 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
30290 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
302a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
302b0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
302c0 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
302d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
302e0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
302f0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
30300 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
30310 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
30320 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
30330 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
30340 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
30350 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f  ** it has a zero
30360 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
30370 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
30380 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
30390 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
303a0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
303b0 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
303c0 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
303d0 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
303e0 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
303f0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
30400 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
30410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
30420 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
30430 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
30440 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
30450 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
30460 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
30470 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
30480 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
30490 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
304a0 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
304b0 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
304c0 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
304d0 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
304e0 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
304f0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
30500 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
30510 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
30520 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
30530 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
30540 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
30550 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
30560 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30570 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
30580 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
30590 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
305a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
305b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
305c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
305d0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
305e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
305f0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
30600 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
30610 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
30620 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
30630 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
30640 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
30650 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
30660 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
30670 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
30680 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
30690 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
306a0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
306b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
306c0 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
306d0 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
306e0 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
306f0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
30700 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
30710 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
30720 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
30730 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
30740 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
30750 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
30760 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
30770 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
30780 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
30790 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
307a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
307b0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
307c0 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
307d0 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
307e0 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
307f0 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
30800 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
30810 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
30820 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
30830 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
30840 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
30850 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
30860 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
30870 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
30880 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
30890 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
308a0 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
308b0 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
308c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
308d0 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
308e0 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
308f0 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
30900 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
30910 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
30920 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
30930 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
30940 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
30950 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
30960 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
30970 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
30980 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
30990 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
309a0 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
309b0 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
309c0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
309d0 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
309e0 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
309f0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
30a00 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
30a10 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
30a20 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
30a30 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
30a40 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
30a50 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
30a60 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
30a70 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
30a80 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
30a90 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
30aa0 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
30ab0 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
30ac0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
30ad0 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
30ae0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
30af0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
30b00 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
30b10 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
30b20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
30b30 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
30b40 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
30b50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30b70 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
30b80 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
30b90 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
30ba0 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
30bb0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
30bc0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
30bd0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
30be0 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
30bf0 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
30c00 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
30c10 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
30c20 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
30c30 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
30c40 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
30c50 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
30c60 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
30c70 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  s mode..  */.  a
30c80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
30c90 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
30ca0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
30cb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
30cc0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
30cd0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
30ce0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
30cf0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
30d00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
30d10 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
30d20 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
30d30 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
30d40 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
30d50 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
30d60 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70  ode; }..  if( !p
30d70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
30d80 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
30d90 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
30da0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
30db0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
30dc0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
30dd0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
30de0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
30df0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
30e00 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20   !MEMDB );..    
30e10 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
30e20 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
30e30 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
30e40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
30e60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
30e70 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
30e80 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
30e90 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
30ea0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
30eb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
30ec0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
30ed0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
30ee0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
30ef0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
30f00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
30f10 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
30f20 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
30f30 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
30f40 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
30f50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
30f60 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
30f70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
30f80 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
30f90 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61  ger, &bHotJourna
30fa0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
30fb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30fc0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  ){.      goto fa
30fd0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
30fe0 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  if( bHotJournal 
30ff0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
31000 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
31010 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31020 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
31030 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
31040 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31050 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
31060 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
31070 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
31080 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
31090 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
310a0 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
310b0 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
310c0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
310d0 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
310e0 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
310f0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
31100 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
31110 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
31120 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
31130 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
31140 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
31150 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
31160 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
31170 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
31180 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
31190 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
311a0 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
311b0 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a  ll rolling the .
311c0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
311d0 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20  rnal back..     
311e0 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
311f0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
31200 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
31210 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
31220 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20  ested, any.     
31230 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73   ** other proces
31240 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
31250 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
31260 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65  ase file will ge
31270 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74  t to .      ** t
31280 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
31290 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
312a0 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  o obtain its own
312b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
312c0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
312d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
312e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
312f0 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
31300 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67  er is in locking
31310 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
31320 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69  mode, the lock i
31330 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67  s.      ** downg
31340 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f  raded to SHARED_
31350 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73  LOCK before this
31360 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
31370 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
31380 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
31390 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
313a0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
313b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
313c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
313d0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
313e0 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49    }. .      /* I
313f0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
31400 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65  ady open and the
31410 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20   file exists on 
31420 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a  disk, open the .
31430 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
31440 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
31450 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63  access. Write ac
31460 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64  cess is required
31470 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20   because .      
31480 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ** in exclusive-
31490 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
314a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
314b0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
314c0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  n .      ** and 
314d0 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
314e0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
314f0 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20  later on. Also, 
31500 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20  write-access .  
31510 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c      ** is usuall
31520 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69  y required to fi
31530 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
31540 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  al in journal_mo
31550 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20  de=persist .    
31560 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61    ** mode (and a
31570 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f  lso for journal_
31580 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e  mode=truncate on
31590 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a   some systems)..
315a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
315b0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
315c0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
315d0 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e   it usually mean
315e0 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20  s that some .   
315f0 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
31600 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74  ection managed t
31610 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c  o get in and rol
31620 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65  l it back before
31630 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
31640 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69  connection obtai
31650 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ned the exclusiv
31660 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72  e lock above. Or
31670 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  , it .      ** m
31680 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ay mean that the
31690 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68   pager was in th
316a0 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
316b0 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  en this.      **
316c0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
316d0 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75  lled and the jou
316e0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
316f0 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
31700 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
31710 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31720 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
31730 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
31740 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
31750 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e  pVfs;.        in
31760 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20  t bExists;      
31770 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31780 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
31790 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20  exists */.      
317a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
317b0 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
317c0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
317d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
317e0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
317f0 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20  , &bExists);.   
31800 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31810 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74  ITE_OK && bExist
31820 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
31830 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
31840 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
31850 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
31860 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
31870 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
31880 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31890 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
318a0 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
318b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
318c0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
318d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
318e0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
318f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
31900 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
31910 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
31920 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
31930 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
31940 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
31950 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
31960 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
31970 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31980 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
31990 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
319a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
319b0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
319c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
319d0 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
319e0 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
319f0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
31a00 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
31a10 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
31a20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
31a30 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
31a40 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
31a50 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
31a60 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
31a70 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
31a80 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
31a90 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
31aa0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
31ab0 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
31ac0 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a    Sync the hot j
31ad0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
31ae0 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69  aying.      ** i
31af0 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65  t back since the
31b00 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
31b10 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74  ashed and left t
31b20 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20  he hot journal. 
31b30 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
31b40 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74   did not sync it
31b50 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75   and we are requ
31b60 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73  ired to always s
31b70 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ync.      ** the
31b80 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
31b90 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e  playing it back.
31ba0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31bb0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
31bc0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
31bd0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
31be0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
31bf0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79      rc = pagerSy
31c00 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
31c10 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
31c20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
31c40 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
31c50 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
31c60 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
31c70 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
31c80 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EN;.        }.  
31c90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
31ca0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
31cb0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
31cc0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
31cd0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
31ce0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  K);.      }..   
31cf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31d10 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
31d20 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72  s taken if an er
31d30 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
31d40 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a   trying to open.
31d50 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f          ** or ro
31d60 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ll back a hot-jo
31d70 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64  urnal while hold
31d80 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
31d90 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
31da0 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     ** pager_unlo
31db0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ck() routine wil
31dc0 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  l be called befo
31dd0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20  re returning to 
31de0 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a  unlock.        *
31df0 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  * the file. If t
31e00 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70  he unlock attemp
31e10 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61  t fails, then Pa
31e20 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ger.eLock must b
31e30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  e.        ** set
31e40 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
31e50 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e   (see the commen
31e60 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
31e70 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20  ine for .       
31e80 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   ** UNKNOWN_LOCK
31e90 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78   above for an ex
31ea0 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20  planation). .   
31eb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31ec0 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67  ** In order to g
31ed0 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  et pager_unlock(
31ee0 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65  ) to do this, se
31ef0 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  t Pager.eState t
31f00 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47  o.        ** PAG
31f10 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68  ER_ERROR now. Th
31f20 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
31f30 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20  ly counted as a 
31f40 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20  transition.     
31f50 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73     ** to ERROR s
31f60 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74  tate in the stat
31f70 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65  e diagram at the
31f80 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
31f90 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  e,.        ** si
31fa0 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
31fb0 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74   the same call t
31fc0 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
31fd0 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20   will very.     
31fe0 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72     ** shortly tr
31ff0 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67  ansition the pag
32000 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
32010 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c   OPEN state. Cal
32020 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ling.        ** 
32030 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
32040 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20  te() would fail 
32050 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c  now, as it shoul
32060 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  d not be possibl
32070 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
32080 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  be in ERROR stat
32090 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  e when there are
320a0 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e   zero outstandin
320b0 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20  g page .        
320c0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20  ** references.. 
320d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
320e0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
320f0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
32100 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32110 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
32120 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32130 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
32140 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  N );.      asser
32150 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
32160 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  k==SHARED_LOCK).
32170 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
32180 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
32190 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
321a0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
321b0 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  K).      );.    
321c0 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
321d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
321e0 70 50 61 67 65 72 2d 3e 68 61 73 42 65 65 6e 55  pPager->hasBeenU
321f0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sed ){.      /* 
32200 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
32210 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
32220 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63  quired then chec
32230 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
32240 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
32250 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
32260 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
32270 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
32280 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  d,.      ** flus
32290 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
322a0 65 20 70 50 61 67 65 72 2d 3e 68 61 73 42 65 65  e pPager->hasBee
322b0 6e 55 73 65 64 20 66 6c 61 67 20 70 72 65 76 65  nUsed flag preve
322c0 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  nts this from.  
322d0 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67      ** occurring
322e0 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72   on the very fir
322f0 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66  st access to a f
32300 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ile, in order to
32310 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
32320 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73   single unnecess
32330 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ary sqlite3OsRea
32340 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20  d() call at the 
32350 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20  start-up..      
32360 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
32370 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65  base changes are
32380 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
32390 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
323a0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
323b0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
323c0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
323d0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
323e0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
323f0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
32400 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
32410 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
32420 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
32430 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
32440 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
32450 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
32460 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
32470 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
32480 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
32490 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
324a0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
324b0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
324c0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
324d0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
324e0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
324f0 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
32500 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
32510 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
32520 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
32530 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
32540 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
32550 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
32560 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
32570 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
32580 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
32590 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
325a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
325b0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
325c0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
325d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
325e0 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
325f0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
32600 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
32610 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
32620 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
32630 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
32640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32650 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
32660 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
32670 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32680 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
32690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
326a0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
326b0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
326c0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
326d0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
326e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
326f0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
32700 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
32710 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32720 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
32730 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
32740 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
32750 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
32760 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32770 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
32780 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
32790 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
327a0 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
327b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
327c0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
327d0 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
327e0 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
327f0 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
32800 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
32810 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
32820 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
32830 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
32840 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
32850 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
32860 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
32870 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
32880 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
32890 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
328a0 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
328b0 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
328c0 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
328d0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
328e0 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
328f0 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
32900 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
32910 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
32920 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
32930 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
32940 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43       if( USEFETC
32950 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  H(pPager) ){.   
32960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
32970 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
32980 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
32990 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
329a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
329b0 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
329c0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
329d0 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
329e0 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
329f0 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
32a00 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
32a10 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
32a20 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
32a30 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
32a40 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
32a50 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
32a60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32a70 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
32a80 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
32a90 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
32aa0 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
32ab0 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
32ac0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
32ad0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
32ae0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
32af0 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
32b00 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
32b10 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
32b20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
32b30 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
32b40 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
32b50 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
32b60 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
32b70 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
32b80 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
32b90 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
32ba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
32bb0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
32bc0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
32bd0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
32be0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32bf0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32c00 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
32c10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
32c20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
32c30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
32c50 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
32c60 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
32c70 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
32c80 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
32c90 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
32ca0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
32cb0 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
32cc0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
32cd0 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
32ce0 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
32cf0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
32d00 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
32d10 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
32d20 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
32d30 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
32d40 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
32d50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
32d60 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
32d70 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
32d80 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
32d90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
32da0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
32db0 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33 50  ==0 && (sqlite3P
32dc0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
32dd0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
32de0 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  0) ){.    pagerU
32df0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
32e00 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
32e10 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
32e20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
32e30 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
32e40 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
32e50 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
32e60 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
32e70 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
32e80 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
32e90 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
32ea0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
32eb0 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
32ec0 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
32ed0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
32ee0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
32ef0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
32f00 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
32f10 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
32f20 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
32f30 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
32f40 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
32f50 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
32f60 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
32f70 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
32f80 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
32f90 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
32fa0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
32fb0 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
32fc0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
32fd0 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
32fe0 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
32ff0 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
33000 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
33010 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
33020 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
33030 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
33040 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
33050 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
33060 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
33070 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
33080 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
33090 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
330a0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
330b0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
330c0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
330d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
330e0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
330f0 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
33100 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
33110 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
33120 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
33130 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
33140 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
33150 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
33160 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
33170 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
33180 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
33190 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
331a0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
331b0 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
331c0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
331d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
331e0 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
331f0 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
33200 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
33210 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
33220 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
33230 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
33240 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
33250 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
33260 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
33270 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
33280 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
33290 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
332a0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
332b0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
332c0 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
332d0 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
332e0 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65  .**   a) When re
332f0 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73  ading a free-lis
33300 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  t leaf page from
33310 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
33320 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68  nd.**.**   b) Wh
33330 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69  en a savepoint i
33340 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
33350 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20  ack and we need 
33360 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  to load.**      
33370 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20  a new page into 
33380 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20  the cache to be 
33390 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
333a0 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
333b0 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
333c0 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
333d0 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
333e0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
333f0 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
33400 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
33410 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72  ad of.** being r
33420 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
33430 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
33440 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
33450 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
33460 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
33470 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
33480 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
33490 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
334a0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
334b0 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
334c0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
334d0 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
334e0 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
334f0 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
33500 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
33510 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
33520 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
33530 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
33540 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
33550 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
33560 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
33570 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
33580 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
33590 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
335a0 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
335b0 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
335c0 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
335d0 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
335e0 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
335f0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
33600 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
33610 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
33620 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
33630 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
33640 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
33650 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
33660 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
33670 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
33680 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
33690 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
336a0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
336b0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
336c0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
336d0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
336e0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
336f0 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
33700 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
33710 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
33720 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
33730 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
33740 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
33750 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
33760 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
33770 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
33780 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
33790 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
337a0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
337b0 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
337c0 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
337d0 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
337e0 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
337f0 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
33800 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
33810 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
33820 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
33830 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
33840 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
33850 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
33860 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
33870 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
33880 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
33890 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
338a0 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
338b0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
338c0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
338d0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
338e0 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
338f0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
33900 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33910 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
33920 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d  ;.  u32 iFrame =
33930 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
33940 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20      /* Frame to 
33950 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69  read from WAL fi
33960 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  le */.  const in
33970 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66  t noContent = (f
33980 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
33990 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20  _NOCONTENT);..  
339a0 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61  /* It is accepta
339b0 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61  ble to use a rea
339c0 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61  d-only (mmap) pa
339d0 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ge for any page 
339e0 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65  except.  ** page
339f0 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   1 if there is n
33a00 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
33a10 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20  ion open or the 
33a20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59  ACQUIRE_READONLY
33a30 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73  .  ** flag was s
33a40 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
33a50 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c  caller. And so l
33a60 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73  ong as the db is
33a70 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d   not a .  ** tem
33a80 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
33a90 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a  ory database.  *
33aa0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d  /.  const int bM
33ab0 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31  mapOk = (pgno!=1
33ac0 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61   && USEFETCH(pPa
33ad0 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67  ger).   && (pPag
33ae0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33af0 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
33b00 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52  gs & PAGER_GET_R
33b10 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66  EADONLY)).#ifdef
33b20 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
33b30 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e  C.   && pPager->
33b40 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66  xCodec==0.#endif
33b50 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
33b60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33b70 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
33b80 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
33b90 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33ba0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
33bb0 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
33bc0 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b  || bMmapOk==0 );
33bd0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ..  if( pgno==0 
33be0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33bf0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33c00 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  T;.  }.  pPager-
33c10 3e 68 61 73 42 65 65 6e 55 73 65 64 20 3d 20 31  >hasBeenUsed = 1
33c20 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
33c30 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
33c40 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
33c50 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
33c60 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
33c70 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
33c80 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
33c90 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
33ca0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
33cb0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
33cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
33cd0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
33ce0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
33cf0 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70  if( bMmapOk && p
33d00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
33d10 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
33d20 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
33d30 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
33d40 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
33d50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
33d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
33d70 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
33d80 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
33d90 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69  if( bMmapOk && i
33da0 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Frame==0 ){.    
33db0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
33dc0 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0;..      rc = s
33dd0 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50  qlite3OsFetch(pP
33de0 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20  ager->fd, .     
33df0 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d       (i64)(pgno-
33e00 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  1) * pPager->pag
33e10 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70  eSize, pPager->p
33e20 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a  ageSize, &pData.
33e30 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
33e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33e50 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20  K && pData ){.  
33e60 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
33e70 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52  ->eState>PAGER_R
33e80 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20 20 20  EADER ){.       
33e90 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
33ea0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
33eb0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
33ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
33ed0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
33ee0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41       rc = pagerA
33ef0 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50  cquireMapPage(pP
33f00 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74  ager, pgno, pDat
33f10 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  a, &pPg);.      
33f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33f30 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
33f40 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
33f50 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50  (i64)(pgno-1)*pP
33f60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
33f70 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
33f80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
33f90 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  g ){.          a
33fa0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
33fb0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
33fc0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
33fd0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
33fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
33ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34000 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34010 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34020 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34030 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34040 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20  }.    }..    {. 
34050 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61       sqlite3_pca
34060 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b  che_page *pBase;
34070 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d 20 73  .      pBase = s
34080 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34090 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
340a0 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20  e, pgno, 3);.   
340b0 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
340c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
340d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
340e0 63 68 53 74 72 65 73 73 28 70 50 61 67 65 72 2d  chStress(pPager-
340f0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34100 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  &pBase);.       
34110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34120 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
34130 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34140 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d     }.      pPg =
34150 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74   *ppPage = sqlit
34160 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
34170 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
34180 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65  che, pgno, pBase
34190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
341a0 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
341b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
341c0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
341d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
341e0 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c  * Either the cal
341f0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
34200 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e  heFetch() return
34210 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74  ed an error or t
34220 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
34230 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  was already in t
34240 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
34250 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
34260 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  n was called..  
34270 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20    ** Set pPg to 
34280 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68  0 and jump to th
34290 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64  e exception hand
342a0 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67  ler.  */.    pPg
342b0 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70   = 0;.    goto p
342c0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
342d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
342e0 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29  pPg==(*ppPage) )
342f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
34300 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
34310 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
34320 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
34330 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
34340 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  ;..  if( pPg->pP
34350 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
34360 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
34370 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
34380 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
34390 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
343a0 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
343b0 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
343c0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
343d0 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
343e0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
343f0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
34400 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
34410 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
34420 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
34430 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
34440 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
34450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
34460 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
34470 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
34480 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
34490 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
344a0 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
344b0 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
344c0 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 2d 3e  .  */..    pPg->
344d0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
344e0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
344f0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
34500 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
34510 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
34520 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
34530 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
34540 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
34550 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
34560 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
34570 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
34580 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
34590 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
345a0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
345b0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
345c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
345d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
345e0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
345f0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
34600 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67  f( MEMDB || pPag
34610 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20  er->dbSize<pgno 
34620 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20  || noContent || 
34630 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
34640 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
34650 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
34660 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
34670 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
34680 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
34690 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
346a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
346b0 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
346c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
346d0 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
346e0 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
346f0 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
34700 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
34710 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
34720 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
34730 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
34740 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
34750 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
34760 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
34770 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
34780 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
34790 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
347a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
347b0 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
347c0 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
347d0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
347e0 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
347f0 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
34800 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
34810 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34820 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
34830 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
34840 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
34850 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
34860 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
34870 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
34880 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
34890 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
348a0 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
348b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
348c0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
348d0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
348e0 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
348f0 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
34900 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
34910 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
34920 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
34930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34940 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
34950 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
34960 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
34970 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
34980 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
34990 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
349a0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
349b0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
349c0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
349d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
349e0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
349f0 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b  ager) && bMmapOk
34a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
34a10 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
34a20 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
34a30 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
34a40 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
34a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34a60 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
34a70 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34a80 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
34a90 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
34aa0 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ger );.      pPa
34ab0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
34ac0 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20  _STAT_MISS]++;. 
34ad0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
34ae0 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65  Page(pPg, iFrame
34af0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
34b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34b10 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34b20 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34b40 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
34b50 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  sh(pPg);.  }..  
34b60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34b70 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
34b80 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
34b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
34ba0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
34bb0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
34bc0 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
34bd0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
34be0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  sed(pPager);..  
34bf0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  *ppPage = 0;.  r
34c00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34c10 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
34c20 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
34c30 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
34c40 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
34c50 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
34c60 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
34c70 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
34c80 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
34c90 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
34ca0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
34cb0 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
34cc0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
34cd0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
34ce0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
34cf0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
34d00 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
34d10 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
34d20 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
34d30 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
34d40 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
34d50 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
34d60 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
34d70 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
34d80 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
34d90 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
34da0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
34db0 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
34dc0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
34dd0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
34de0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
34df0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
34e00 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
34e10 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70  no){.  sqlite3_p
34e20 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67  cache_page *pPag
34e30 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
34e40 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
34e50 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
34e60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34e70 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
34e80 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   pPage = sqlite3
34e90 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
34ea0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34eb0 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 0);.  assert(
34ec0 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61   pPage==0 || pPa
34ed0 67 65 72 2d 3e 68 61 73 42 65 65 6e 55 73 65 64  ger->hasBeenUsed
34ee0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
34ef0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
34f00 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
34f10 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61  Cache, pgno, pPa
34f20 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
34f30 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
34f40 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
34f50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
34f60 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
34f70 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
34f80 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
34f90 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
34fa0 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
34fb0 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
34fc0 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
34fd0 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
34fe0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
34ff0 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
35000 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35010 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
35020 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
35030 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
35040 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
35050 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
35060 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
35070 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70   );.  pPager = p
35080 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
35090 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  ( pPg->flags & P
350a0 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20  GHDR_MMAP ){.   
350b0 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
350c0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
350d0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  se{.    sqlite3P
350e0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
350f0 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
35100 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
35110 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ger);.}.void sql
35120 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
35130 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
35140 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33  f( pPg ) sqlite3
35150 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
35160 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l(pPg);.}../*.**
35170 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
35180 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
35190 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
351a0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
351b0 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
351c0 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
351d0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
351e0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
351f0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
35200 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
35210 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
35220 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
35230 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
35240 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
35250 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
35260 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
35270 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
35280 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
35290 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
352a0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
352b0 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
352c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
352d0 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
352e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
352f0 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
35300 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
35310 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
35320 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
35330 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
35340 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
35350 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
35360 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
35370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
35380 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
35390 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
353a0 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
353b0 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
353c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
353d0 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
353e0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
353f0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
35400 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
35410 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
35420 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
35430 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35440 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
35450 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
35460 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
35470 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
35480 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
35490 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
354a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
354b0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
354c0 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
354d0 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
354e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
354f0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
35500 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
35510 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
35520 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
35530 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
35540 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
35550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
35560 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
35570 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
35580 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
35590 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
355a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
355b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
355d0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
355e0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
355f0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
35600 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
35610 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
35620 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
35630 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35640 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35650 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
35660 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35670 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
35680 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
35690 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
356a0 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
356b0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
356c0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
356d0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
356e0 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
356f0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
35700 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
35710 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
35720 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
35730 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
35740 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
35750 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
35760 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
35770 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
35780 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
35790 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
357a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
357b0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
357c0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
357d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
357e0 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
357f0 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
35800 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  >dbSize);.    if
35810 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
35820 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rnal==0 ){.     
35830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
35840 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  OMEM;.    }.  . 
35850 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
35860 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
35870 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
35880 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   open. */.    if
35890 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
358a0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
358b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
358c0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
358d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
358e0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y ){.        sql
358f0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
35900 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
35910 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35920 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
35930 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
35940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
35950 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
35960 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
35970 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35980 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
35990 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
359a0 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  E|.          (pP
359b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f  ager->tempFile ?
359c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53   .            (S
359d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
359e0 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
359f0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
35a00 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  L):.            
35a10 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
35a20 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
35a30 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20       );..       
35a40 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
35a50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
35a60 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
35a70 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
35a80 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
35a90 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
35aa0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
35ab0 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
35ac0 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
35ad0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
35ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35af0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
35b00 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
35b10 54 45 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  TE.          rc 
35b20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
35b30 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
35b40 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
35b50 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
35b60 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
35b70 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
35b80 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 20  Pager).         
35b90 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
35ba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35bb0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
35bc0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
35bd0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
35be0 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
35bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35c00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
35c10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
35c20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
35c30 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
35c40 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
35c50 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
35c60 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
35c70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
35c80 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
35c90 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
35ca0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
35cb0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
35cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35cd0 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
35ce0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
35cf0 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
35d00 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
35d10 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
35d20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
35d30 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
35d40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
35d50 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
35d60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35d70 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
35d80 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
35d90 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
35da0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
35db0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35dc0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
35dd0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
35de0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
35df0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35e00 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
35e10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
35e20 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35e30 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35e40 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
35e50 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
35e60 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
35e70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
35e80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
35e90 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
35ea0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
35eb0 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
35ec0 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
35ed0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
35ee0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
35ef0 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
35f00 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
35f10 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
35f20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
35f30 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
35f40 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
35f50 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
35f60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35f70 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
35f80 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
35f90 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
35fa0 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
35fb0 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
35fc0 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
35fd0 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
35fe0 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
35ff0 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
36000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
36010 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
36020 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
36030 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
36040 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
36050 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
36060 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
36070 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
36080 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
36090 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
360a0 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
360b0 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
360c0 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
360d0 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
360e0 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
360f0 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
36100 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
36110 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
36120 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
36130 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
36140 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
36150 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
36160 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
36170 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
36180 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
36190 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
361a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
361b0 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
361c0 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
361d0 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
361e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
361f0 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
36200 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
36210 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
36220 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
36230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
36240 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
36250 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
36260 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
36270 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36280 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
36290 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
362a0 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
362b0 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
362c0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
362d0 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
362e0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
362f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36300 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
36310 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36320 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
36330 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
36340 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36350 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
36360 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
36370 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
36380 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
36390 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
363a0 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
363b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
363c0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
363d0 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
363e0 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
363f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
36400 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
36410 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
36420 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
36430 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
36440 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
36450 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
36460 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
36470 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
36480 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36490 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
364a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
364b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
364c0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
364d0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
364e0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
364f0 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
36500 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
36510 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
36520 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
36530 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
36540 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
36550 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
36560 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
36570 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
36580 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
36590 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
365a0 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
365b0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
365c0 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
365d0 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
365e0 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
365f0 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
36600 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
36610 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
36620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
36630 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
36640 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
36650 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
36660 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
36670 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
36680 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36690 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
366a0 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
366b0 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
366c0 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
366d0 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
366e0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
366f0 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
36700 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
36710 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
36720 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
36730 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
36740 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
36750 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
36760 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
36770 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
36780 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
36790 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
367a0 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
367b0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
367c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
367d0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
367e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
367f0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
36800 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
36810 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36820 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
36830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36840 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
36850 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
36860 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
36870 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
36880 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
36890 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
368a0 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
368b0 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
368c0 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
368d0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
368e0 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
368f0 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
36900 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
36910 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
36920 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
36930 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
36940 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
36950 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
36960 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
36970 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
36980 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
36990 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
369a0 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
369b0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
369c0 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
369d0 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
369e0 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
369f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36a00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
36a10 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
36a20 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
36a30 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
36a40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
36a50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
36a60 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  bFileSize = pPag
36a70 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
36a80 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
36a90 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
36aa0 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
36ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
36ac0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
36ad0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36ae0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
36af0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36b00 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
36b10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
36b20 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
36b30 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36b40 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
36b50 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36b60 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36b70 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  er) );.  }..  PA
36b80 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
36b90 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
36ba0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
36bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36bc0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67  ./*.** Write pag
36bd0 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65  e pPg onto the e
36be0 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  nd of the rollba
36bf0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  ck journal..*/.s
36c00 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
36c10 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41  NLINE int pagerA
36c20 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b  ddPageToRollback
36c30 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70  Journal(PgHdr *p
36c40 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
36c50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
36c60 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  er;.  int rc;.  
36c70 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61  u32 cksum;.  cha
36c80 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34  r *pData2;.  i64
36c90 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e   iOff = pPager->
36ca0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
36cb0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
36cc0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
36cd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
36ce0 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63  page that.  ** c
36cf0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
36d00 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
36d10 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
36d20 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20  t verifies.  ** 
36d30 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
36d40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
36d50 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
36d60 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
36d70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
36d80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d  er->journalHdr<=
36d90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36da0 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70  ff );.  CODEC2(p
36db0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
36dc0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
36dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36de0 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
36df0 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
36e00 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
36e10 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a  *)pData2);..  /*
36e20 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
36e30 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
36e40 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f   occurs while jo
36e50 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
36e60 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
36e70 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
36e80 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
36e90 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
36ea0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
36eb0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
36ec0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
36ed0 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
36ee0 69 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b  in.  ** playback
36ef0 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
36f00 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
36f10 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
36f20 20 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69   restored.  ** i
36f30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36f40 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
36f50 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
36f60 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
36f70 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
36f80 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
36f90 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67    */.  pPg->flag
36fa0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
36fb0 53 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72  SYNC;..  rc = wr
36fc0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
36fd0 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67  ->jfd, iOff, pPg
36fe0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72  ->pgno);.  if( r
36ff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
37000 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
37010 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
37020 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
37030 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
37040 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a  eSize, iOff+4);.
37050 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37060 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
37070 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
37080 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
37090 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61   iOff+pPager->pa
370a0 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29  geSize+4, cksum)
370b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
370c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
370d0 63 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28 22  c;..  IOTRACE(("
370e0 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
370f0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
37100 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
37110 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
37120 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
37130 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
37140 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
37150 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
37160 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 54  count);.  PAGERT
37170 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
37180 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
37190 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
371a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47 45  \n",.       PAGE
371b0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
371c0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
371d0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
371e0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
371f0 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
37200 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70 50  sh(pPg)));..  pP
37210 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
37220 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e   += 8 + pPager->
37230 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  pageSize;.  pPag
37240 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73  er->nRec++;.  as
37250 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
37260 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
37270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
37280 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
37290 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
372a0 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73  pgno);.  testcas
372b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
372c0 4d 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MEM );.  assert(
372d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
372e0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
372f0 45 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64  EM );.  rc |= ad
37300 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
37310 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
37320 3e 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74  >pgno);.  assert
37330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37340 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
37350 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
37360 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
37370 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
37380 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
37390 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
373a0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
373b0 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
373c0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
373d0 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
373e0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
373f0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
37400 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
37410 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
37420 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
37430 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
37440 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
37450 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
37460 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
37470 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
37480 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
37490 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
374a0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
374b0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
374c0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
374d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
374e0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
374f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37500 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
37510 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
37520 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69  led unless a wri
37530 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
37540 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a  as already .  **
37550 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54   been started. T
37560 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37570 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
37580 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70  e open at this p
37590 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73  oint..  ** It is
375a0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
375b0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
375c0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
375d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
375e0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
375f0 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
37600 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37610 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
37620 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
37630 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37640 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
37650 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
37660 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37670 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
37680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37690 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20  >errCode==0 );. 
376a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
376b0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
376c0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
376d0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
376e0 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
376f0 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69  to be opened. Hi
37700 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
37710 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  nes have already
37720 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74  .  ** obtained t
37730 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63  he necessary loc
37740 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ks to begin the 
37750 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
37760 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20  n, but the.  ** 
37770 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
37780 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
37790 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20  e open. Open it 
377a0 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74  now if this is t
377b0 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  he case..  **.  
377c0 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
377d0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73  before calling s
377e0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
377f0 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70  Dirty() on the p
37800 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  age. .  ** Other
37810 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65  wise, if it were
37820 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c   done after call
37830 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
37840 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68  eMakeDirty(), th
37850 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  en.  ** an error
37860 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64   might occur and
37870 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64   the pager would
37880 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45   end up in WRITE
37890 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20  R_LOCKED state. 
378a0 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d   ** with pages m
378b0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69  arked as dirty i
378c0 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a  n the cache..  *
378d0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
378e0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
378f0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
37900 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
37910 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
37920 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
37930 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37940 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
37950 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37960 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
37970 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
37980 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37990 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
379a0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  r) );..  /* Mark
379b0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69   the page that i
379c0 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f  s about to be mo
379d0 64 69 66 69 65 64 20 61 73 20 64 69 72 74 79 2e  dified as dirty.
379e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
379f0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
37a00 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f  );..  /* If a ro
37a10 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69  llback journal i
37a20 73 20 69 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d  s in use, them m
37a30 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 61 67  ake sure the pag
37a40 65 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 0a  e that is about.
37a50 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 69    ** to change i
37a60 73 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  s in the rollbac
37a70 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  k journal, or if
37a80 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6e   the page is a n
37a90 65 77 20 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a  ew page off.  **
37aa0 20 74 68 65 6e 20 65 6e 64 20 6f 66 20 74 68 65   then end of the
37ab0 20 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65   file, make sure
37ac0 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73   it is marked as
37ad0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
37ae0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
37af0 20 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   (pPager->pInJou
37b00 72 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70  rnal!=0) == isOp
37b10 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
37b20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
37b30 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 20  >pInJournal!=0  
37b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b60 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 6f      /* Journal o
37b70 70 65 6e 20 2a 2f 0a 20 20 20 26 26 20 73 71 6c  pen */.   && sql
37b80 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f  ite3BitvecTestNo
37b90 74 4e 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70 49  tNull(pPager->pI
37ba0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
37bb0 67 6e 6f 29 3d 3d 30 20 2f 2a 20 70 50 67 20 6e  gno)==0 /* pPg n
37bc0 6f 74 20 69 6e 20 6a 72 6e 6c 20 2a 2f 0a 20 20  ot in jrnl */.  
37bd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
37be0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
37bf0 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  r)==0 );.    if(
37c00 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
37c10 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
37c20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
37c30 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62  erAddPageToRollb
37c40 61 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67 29 3b  ackJournal(pPg);
37c50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
37c60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37c70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
37c90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
37ca0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
37cb0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
37cc0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66  {.        pPg->f
37cd0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
37ce0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d  ED_SYNC;.      }
37cf0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
37d00 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E(("APPEND %d pa
37d10 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
37d20 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
37d30 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
37d40 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
37d50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
37d60 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
37d70 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
37d80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
37d90 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
37da0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
37db0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
37dc0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
37dd0 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  .  ** then write
37de0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
37df0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
37e00 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rnal..  */.  if(
37e10 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
37e20 69 6e 74 3e 30 20 26 26 20 73 75 62 6a 52 65 71  int>0 && subjReq
37e30 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
37e40 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  {.    rc = subjo
37e50 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
37e60 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
37e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
37e80 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 2a  ze and return. *
37e90 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
37ea0 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
37eb0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
37ec0 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
37ed0 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
37ee0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
37ef0 69 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20  is is a variant 
37f00 6f 66 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  of sqlite3PagerW
37f10 72 69 74 65 28 29 20 74 68 61 74 20 72 75 6e 73  rite() that runs
37f20 20 77 68 65 6e 20 74 68 65 20 73 65 63 74 6f 72   when the sector
37f30 20 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67   size.** is larg
37f40 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
37f50 20 73 69 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d   size.  SQLite m
37f60 61 6b 65 73 20 74 68 65 20 28 72 65 61 73 6f 6e  akes the (reason
37f70 61 62 6c 65 29 20 61 73 73 75 6d 70 74 69 6f 6e  able) assumption
37f80 20 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74   that.** all byt
37f90 65 73 20 6f 66 20 61 20 73 65 63 74 6f 72 20 61  es of a sector a
37fa0 72 65 20 77 72 69 74 74 65 6e 20 74 6f 67 65 74  re written toget
37fb0 68 65 72 20 62 79 20 68 61 72 64 77 61 72 65 2e  her by hardware.
37fc0 20 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74    Hence, all byt
37fd0 65 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f  es of.** a secto
37fe0 72 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  r need to be jou
37ff0 72 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73 65 20  rnalled in case 
38000 6f 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  of a power loss 
38010 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
38020 0a 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a  .** a write..**.
38030 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  ** Usually, the 
38040 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 6c  sector size is l
38050 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
38060 6c 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69  l to the page si
38070 7a 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20  ze, in which.** 
38080 63 61 73 65 20 70 61 67 65 73 20 63 61 6e 20 62  case pages can b
38090 65 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 77  e individually w
380a0 72 69 74 74 65 6e 2e 20 20 54 68 69 73 20 72 6f  ritten.  This ro
380b0 75 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20  utine only runs 
380c0 69 6e 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  in the exception
380d0 61 6c 0a 2a 2a 20 63 61 73 65 20 77 68 65 72 65  al.** case where
380e0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
380f0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
38100 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  he sector size..
38110 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
38120 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61  _NOINLINE int pa
38130 67 65 72 57 72 69 74 65 4c 61 72 67 65 53 65 63  gerWriteLargeSec
38140 74 6f 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tor(PgHdr *pPg){
38150 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
38160 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
38170 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
38180 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65   */.  Pgno nPage
38190 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
381a0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
381b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
381c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
381d0 2f 0a 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20  /.  Pgno pg1;   
381e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381f0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
38200 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
38210 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
38220 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  . */.  int nPage
38230 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
38240 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
38250 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
38260 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
38270 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  nal */.  int ii;
38280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38290 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
382a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
382b0 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
382c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
382d0 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20  rue if any page 
382e0 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  has PGHDR_NEED_S
382f0 59 4e 43 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  YNC */.  Pager *
38300 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
38310 61 67 65 72 3b 20 20 20 2f 2a 20 54 68 65 20 70  ager;   /* The p
38320 61 67 65 72 20 74 68 61 74 20 6f 77 6e 73 20 70  ager that owns p
38330 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61  Pg */.  Pgno nPa
38340 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
38350 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
38360 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
38370 7a 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ze);..  /* Set t
38380 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
38390 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20 54  SYNC bit to 1. T
383a0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
383b0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20  e cannot allow. 
383c0 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65   ** a journal he
383d0 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
383e0 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
383f0 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
38400 79 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  y.  ** this func
38410 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tion..  */.  ass
38420 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
38430 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
38440 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
38450 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 29  PILLFLAG_NOSYNC)
38460 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==0 );.  pPager-
38470 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
38480 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b  PILLFLAG_NOSYNC;
38490 0a 0a 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63  ..  /* This tric
384a0 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
384b0 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
384c0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
384d0 65 20 61 72 65 0a 20 20 2a 2a 20 61 6e 20 69 6e  e are.  ** an in
384e0 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
384f0 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
38500 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
38510 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 6f 66  entifier.  ** of
38520 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
38530 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
38540 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
38550 0a 20 20 2a 2f 0a 20 20 70 67 31 20 3d 20 28 28  .  */.  pg1 = ((
38560 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
38570 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
38580 31 29 29 20 2b 20 31 3b 0a 0a 20 20 6e 50 61 67  1)) + 1;..  nPag
38590 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d  eCount = pPager-
385a0 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  >dbSize;.  if( p
385b0 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
385c0 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  unt ){.    nPage
385d0 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
385e0 70 67 31 29 2b 31 3b 0a 20 20 7d 65 6c 73 65 20  pg1)+1;.  }else 
385f0 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
38600 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
38610 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61  Count ){.    nPa
38620 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
38630 31 2d 70 67 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1-pg1;.  }else{.
38640 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
38650 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 7d 0a  ePerSector;.  }.
38660 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
38670 29 3b 0a 20 20 61 73 73 65 72 74 28 70 67 31 3c  );.  assert(pg1<
38680 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61  =pPg->pgno);.  a
38690 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
386a0 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
386b0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
386c0 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
386d0 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
386e0 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
386f0 69 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  i;.    PgHdr *pP
38700 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 67 3d  age;.    if( pg=
38710 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg-&g