/ Hex Artifact Content
Login

Artifact 4757194b2f1ffd65a5fc45a3df4d38acc41fb7b3:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73  f.};../*.** Bits
5240: 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f   of the Pager.do
5250: 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20  NotSpill flag.  
5260: 53 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63  See further desc
5270: 72 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a  ription below..*
5280: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5290: 4c 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20  LAG_OFF         
52a0: 30 78 30 31 20 20 20 20 20 20 2f 2a 20 4e 65 76  0x01      /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 20 20 20 20 20 2f 2a 20 43 75   0x02      /* Cu
5300: 72 72 65 6e 74 20 72 6f 6c 6c 69 6e 67 20 62 61  rrent rolling ba
5310: 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 73 70  ck, so do not sp
5320: 69 6c 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ill */.#define S
5330: 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
5340: 20 20 20 20 20 30 78 30 34 20 20 20 20 20 20 2f       0x04      /
5350: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5360: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5370: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  /../*.** A open 
5380: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
5390: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
53a0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
53b0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
53c0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
53d0: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
53e0: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
53f0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5400: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5410: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5420: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5430: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5440: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5450: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5460: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
5470: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
5480: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
5490: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
54a0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
54b0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
54c0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
54d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
54e0: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
54f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5500: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5510: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5520: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5530: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5540: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5550: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5560: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
5570: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
5580: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
5590: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
55a0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
55b0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
55c0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
55d0: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
55e0: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
55f0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5600: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5610: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5620: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5630: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5640: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5650: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5660: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
5670: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
5680: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
5690: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
56a0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
56b0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
56c0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
56d0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
56e0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
56f0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5700: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5710: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5720: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5730: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5740: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5750: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5760: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5770: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
5780: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
5790: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
57a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
57b0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
57c0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
57d0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
57e0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
57f0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5800: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5810: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5820: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5830: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5840: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5870: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5880: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5890: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
58a0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
58b0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
58c0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
58d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
58e0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
58f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5900: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5910: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5920: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5930: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5940: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5950: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5960: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5970: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5990: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
59a0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
59b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
59c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
59d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
59e0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
59f0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5a00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5a10: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5a20: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5a30: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5a40: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5a50: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5a60: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5a70: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5a80: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5a90: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5aa0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ab0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5ac0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5ad0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5ae0: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5af0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5b00: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5b10: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5b20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5b40: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5b50: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5b60: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5b70: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5b80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5b90: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5ba0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5bb0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5bc0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5bd0: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5be0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5bf0: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5c00: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5c10: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5c20: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5c30: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5c40: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5c50: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5c60: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5c70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5c80: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5c90: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ca0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5cb0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5cc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5cd0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5ce0: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5cf0: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5d00: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5d10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5d20: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5d30: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5d40: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5d50: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5d60: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5d70: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5d80: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5d90: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5da0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5db0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5dc0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
5dd0: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
5de0: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
5df0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
5e00: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
5e10: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
5e20: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
5e30: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
5e40: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
5e50: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
5e60: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
5e70: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
5e80: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
5e90: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
5ea0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
5eb0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ec0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
5ed0: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5ee0: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
5ef0: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
5f00: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
5f10: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
5f20: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
5f30: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
5f40: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
5f50: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
5f60: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
5f70: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
5f80: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
5f90: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
5fa0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
5fb0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
5fc0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5fd0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5fe0: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
5ff0: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6000: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6010: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6020: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6030: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6040: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6050: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6060: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
6070: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
6080: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
6090: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
60a0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
60b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
60c0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
60d0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
60e0: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
60f0: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6100: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6110: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6120: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6130: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6140: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6150: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6160: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
6170: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
6180: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
6190: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
61a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
61b0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
61c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
61d0: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
61e0: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
61f0: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6200: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6210: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6220: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6230: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6240: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6250: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6260: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
6270: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
6280: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
6290: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20  e database from 
62a0: 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
62b0: 20 20 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c     is permitted,
62c0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
62d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
62e0: 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61 67 20   not. This flag 
62f0: 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79 20 73  is set.**   by s
6300: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6310: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6320: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6330: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
6340: 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61  an.**   the data
6350: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6360: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
6370: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
6380: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
6390: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
63a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63b0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63c0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63d0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63e0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
63f0: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6400: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6410: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6420: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6430: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6440: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6460: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6470: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6480: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
6490: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64a0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64c0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64d0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64e0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
64f0: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6500: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6510: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6520: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6530: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6540: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6550: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6570: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6580: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
6590: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65a0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65b0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65c0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65d0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65e0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
65f0: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6600: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6610: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6620: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6630: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6640: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6650: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6660: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6670: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6680: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
6690: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66a0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66c0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66d0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66e0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
66f0: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6700: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6710: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6720: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6730: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6740: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6750: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6760: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6770: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6780: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
6790: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67a0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67c0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67d0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67e0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
67f0: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6800: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6810: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6820: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6830: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6840: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6850: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6860: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6870: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6880: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
6890: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68b0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68c0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68d0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68e0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
68f0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6900: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6910: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6920: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6930: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6940: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6950: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6960: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6970: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6980: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
6990: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69b0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69c0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
69f0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a00: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a10: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a30: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a50: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a60: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a70: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a80: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6a90: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6aa0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ab0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ac0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ad0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6ae0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6af0: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b00: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b10: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b20: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b30: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b40: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b50: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b60: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b70: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b80: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6b90: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6ba0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bb0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bc0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6bd0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6be0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6bf0: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c00: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c10: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c20: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c30: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c40: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c50: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c60: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c70: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c80: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6c90: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6ca0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cb0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6cd0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6ce0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6cf0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d00: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d10: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d30: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d40: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d50: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d60: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d70: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d80: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6d90: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6da0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6db0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dc0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6dd0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6de0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6df0: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e00: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e10: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e20: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e30: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e40: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e50: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e60: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e70: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e80: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6e90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6ea0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6eb0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ec0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ed0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ee0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6ef0: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f00: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f10: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f20: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f30: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f40: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f50: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f60: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f70: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f80: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6f90: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fa0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fb0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fc0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fd0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6fe0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
6ff0: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7000: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7010: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7020: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7030: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7040: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7050: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7060: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7070: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7080: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
7090: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70a0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70b0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70c0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70d0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70e0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
70f0: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7100: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7120: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7130: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7140: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7150: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7160: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7170: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7180: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
7190: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71a0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71b0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71c0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71d0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
71f0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7200: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7210: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7220: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7230: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7240: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7250: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7260: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
7290: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72a0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72b0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72c0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72d0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72e0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
72f0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ess */.  u8 ckpt
7300: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7310: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7320: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7330: 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20   for checkpoint 
7340: 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46  */.  u8 walSyncF
7350: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7360: 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   /* SYNC_NORMAL 
7370: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72  or SYNC_FULL for
7380: 20 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20   wal writes */. 
7390: 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20   u8 syncFlags;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
73c0: 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69  YNC_FULL otherwi
73d0: 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  se */.  u8 tempF
73e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
73f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
7400: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
7410: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
7420: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
7430: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
7440: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
7450: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
7460: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7470: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7480: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7490: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
74a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
74f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7500: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
7510: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
7520: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
7530: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
7540: 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61 73 73  opertion.  Class
7550: 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e 20   members not in 
7560: 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20 65  this block are e
7570: 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a 2a  ither fixed.  **
7580: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
7590: 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65 64  is first created
75a0: 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63 68   or else only ch
75b0: 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65 20  ange when there 
75c0: 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69 66  is a.  ** signif
75d0: 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e 67  icant mode chang
75e0: 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e 67  e (such as chang
75f0: 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69 7a  ing the page_siz
7600: 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c  e, locking_mode,
7610: 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f 75  .  ** or the jou
7620: 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72 6f  rnal_mode).  Fro
7630: 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c 20  m another view, 
7640: 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  these class memb
7650: 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20 2a  ers describe.  *
7660: 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f 66  * the "state" of
7670: 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69 6c   the pager, whil
7680: 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d 65  e other class me
7690: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20 74  mbers describe t
76a0: 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67 75  he.  ** "configu
76b0: 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20 70  ration" of the p
76c0: 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38 20  ager..  */.  u8 
76d0: 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
76e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
76f0: 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20 52  r state (OPEN, R
7700: 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c 4f  EADER, WRITER_LO
7710: 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38 20  CKED..) */.  u8 
7720: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
7730: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
7740: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7760: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
7770: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
7780: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
7790: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
77a0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
77b0: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
77d0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
77e0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
77f0: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
7800: 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b    u8 doNotSpill;
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7820: 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   Do not spill th
7830: 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e  e cache when non
7840: 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73 75  -zero */.  u8 su
7850: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
7860: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
7870: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
7880: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
7890: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78b0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
78c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
78d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
78e0: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
78f0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7900: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7910: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7920: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7940: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7950: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7960: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7970: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7980: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7990: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
79a0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
79b0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
79d0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
79e0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
79f0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7a20: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7a30: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7a40: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7a50: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7a60: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7a70: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7a80: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7a90: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ab0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7ac0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7ad0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7ae0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7af0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7b00: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7b10: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7b20: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7b30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7b40: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7b50: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7b60: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7b70: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7b80: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7b90: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ba0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7bb0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7bc0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7bd0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7be0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7bf0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7c00: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7c10: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7c20: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7c30: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7c40: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7c50: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7c60: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7c70: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7c80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7c90: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7ca0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7cb0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7cc0: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7cd0: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7ce0: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7cf0: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7d00: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7d10: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7d20: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d40: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7d50: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7d60: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
7d70: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
7d80: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7d90: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7da0: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
7db0: 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  /..  u8 bUseFetc
7dc0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7dd0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7de0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69 6e  xFetch() */.  in
7df0: 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20  t nMmapOut;     
7e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e10: 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65  ber of mmap page
7e20: 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73  s currently outs
7e30: 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c  tanding */.  sql
7e40: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
7e50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69  p;       /* Desi
7e60: 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70  red maximum mmap
7e70: 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72   size */.  PgHdr
7e80: 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b   *pMmapFreelist;
7e90: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
7ea0: 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65  f free mmap page
7eb0: 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74 79   headers (pDirty
7ec0: 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  ) */.  /*.  ** E
7ed0: 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e  nd of the routin
7ee0: 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61  ely-changing cla
7ef0: 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a  ss members.  ***
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f40: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36  ********/..  u16
7f50: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
7f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
7f70: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
7f80: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
7f90: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20  y page */.  i16 
7fa0: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
7fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7fc0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
7fd0: 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68  s at end of each
7fe0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76   page */.  u32 v
7ff0: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
8000: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
8010: 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  for sqlite3_vfs.
8020: 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32  xOpen() */.  u32
8030: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
8040: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
8050: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
8060: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
8070: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
8080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8090: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
80a0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
80b0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
80d0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
80e0: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
80f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20  tabase */.  i64 
8100: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
8110: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
8120: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
8130: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
8140: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
8150: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
8160: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8180: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
8190: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
81a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
81b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
81c0: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
81d0: 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f  ndler)(void*); /
81e0: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61  * Function to ca
81f0: 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a  ll when busy */.
8200: 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
8210: 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a  dlerArg;      /*
8220: 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e   Context argumen
8230: 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c  t for xBusyHandl
8240: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61  er */.  int aSta
8250: 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  t[3];           
8260: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63      /* Total cac
8270: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20  he hits, misses 
8280: 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69  and writes */.#i
8290: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
82a0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
82c0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
82d0: 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a   read */.#endif.
82e0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
82f0: 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a  er)(DbPage*); /*
8300: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
8310: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
8320: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
8330: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
8340: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
8350: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
8360: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
8370: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
8380: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
8390: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
83a0: 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
83b0: 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66  t,int); /* Notif
83c0: 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63  y of page size c
83d0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64  hanges */.  void
83e0: 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
83f0: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20  oid*);          
8400: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
8410: 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a   for the codec *
8420: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
8430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8440: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
8450: 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d  t to xCodec... m
8460: 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66  ethods */.#endif
8470: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
8480: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
8490: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
84a0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
84b0: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
84c0: 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65   PCache *pPCache
84d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
84e0: 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
84f0: 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cache object */.
8500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8510: 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70  MIT_WAL.  Wal *p
8520: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
8530: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61        /* Write-a
8540: 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79  head log used by
8550: 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77   "journal_mode=w
8560: 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  al" */.  char *z
8570: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
8580: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d       /* File nam
8590: 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61  e for write-ahea
85a0: 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a  d log */.#endif.
85b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65  };../*.** Indexe
85c0: 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 50  s for use with P
85d0: 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68  ager.aStat[]. Th
85e0: 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20  e Pager.aStat[] 
85f0: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  array contains.*
8600: 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63 63  * the values acc
8610: 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e 67  essed by passing
8620: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
8630: 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48  _CACHE_HIT, CACH
8640: 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41  E_MISS .** or CA
8650: 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c  CHE_WRITE to sql
8660: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29  ite3_db_status()
8670: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
8680: 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a  ER_STAT_HIT   0.
8690: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
86a0: 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69  AT_MISS  1.#defi
86b0: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52  ne PAGER_STAT_WR
86c0: 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ITE 2../*.** The
86d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
86e0: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
86f0: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
8700: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
8710: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
8720: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
8730: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
8740: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
8750: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
8760: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
8770: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
8780: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8790: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
87a0: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
87b0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
87c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
87d0: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
87e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
87f0: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
8800: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
8810: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
8820: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
8830: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
8840: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
8850: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
8860: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
8870: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
8880: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8890: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
88a0: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
88b0: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
88c0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
88d0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
88e0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
88f0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
8900: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
8910: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
8920: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
8930: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
8940: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
8950: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
8960: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
8970: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8980: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
8990: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
89a0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
89b0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
89c0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
89d0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a  ournal is being.
89e0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
89f0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
8a00: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
8a10: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
8a20: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
8a30: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
8a40: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
8a50: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
8a60: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
8a70: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
8a80: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
8a90: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
8aa0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
8ab0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
8ac0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
8ad0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
8ae0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
8af0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
8b00: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
8b10: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
8b20: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8b30: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
8b40: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
8b50: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
8b60: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
8b70: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
8b80: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
8b90: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
8ba0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
8bb0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
8bc0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8bd0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
8be0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
8bf0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
8c00: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
8c10: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
8c20: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
8c30: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
8c40: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
8c50: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
8c60: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
8c70: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
8c80: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
8c90: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
8ca0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
8cb0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
8cc0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
8cd0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
8ce0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
8cf0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
8d00: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
8d10: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
8d20: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
8d30: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
8d40: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
8d50: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
8d60: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
8d70: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
8d80: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
8d90: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
8da0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
8db0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
8dc0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
8dd0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
8de0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8df0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
8e00: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
8e10: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
8e20: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
8e30: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
8e40: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
8e50: 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  the of each page
8e60: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
8e70: 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20  ournal is given 
8e80: 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  by.** the follow
8e90: 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64  ing macro..*/.#d
8ea0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
8eb0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
8ec0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8ed0: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
8ee0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8ef0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
8f00: 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75  ger. This is usu
8f10: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ally the same .*
8f20: 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67  * size as a sing
8f30: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
8f40: 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74  See also setSect
8f50: 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65  orSize()..*/.#de
8f60: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
8f70: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
8f80: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
8f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
8fa0: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
8fb0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
8fc0: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
8fd0: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
8fe0: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
8ff0: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
9000: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
9010: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
9020: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
9030: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
9040: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
9050: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
9060: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
9070: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
9080: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
9090: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
90a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
90b0: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
90c0: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
90d0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
90e0: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
90f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
9100: 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74 72  o USEFETCH is tr
9110: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 6c  ue if we are all
9120: 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  owed to use the 
9130: 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66 65  xFetch and xUnfe
9140: 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  tch.** interface
9150: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9160: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 6d  database using m
9170: 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
9180: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
9190: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
91a0: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
91b0: 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46  H(x) ((x)->bUseF
91c0: 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20 64 65  etch).#else.# de
91d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
91e0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
91f0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
9200: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
9210: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
9220: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
9230: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
9240: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
9250: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
9260: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
9270: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
9280: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
9290: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
92a0: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
92b0: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
92c0: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
92d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
92e0: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
92f0: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
9300: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
9310: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9320: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
9330: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
9340: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
9350: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
9360: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
9370: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
9380: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
9390: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
93a0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
93b0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
93c0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
93d0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
93e0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
93f0: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
9400: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
9410: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
9420: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
9430: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
9440: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
9450: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
9460: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
9470: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9480: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9490: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
94a0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
94b0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
94c0: 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  y) 0.# define pa
94d0: 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
94e0: 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ent(z) SQLITE_OK
94f0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42  .# define pagerB
9500: 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
9510: 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  ion(z) SQLITE_OK
9520: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9530: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
9540: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
9550: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
9560: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
9570: 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66   );.**.** This f
9580: 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e  unction runs man
9590: 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79  y asserts to try
95a0: 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69   to find inconsi
95b0: 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74  stencies in.** t
95c0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
95d0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
95e0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
95f0: 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65   int assert_page
9600: 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  r_state(Pager *p
9610: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
9620: 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74  er = p;..  /* St
9630: 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ate must be vali
9640: 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  d. */.  assert( 
9650: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9660: 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20  _OPEN.       || 
9670: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9680: 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c  _READER.       |
9690: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
96a0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
96b0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
96c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
96d0: 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
96e0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
96f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
9700: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9710: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9720: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20  RITER_FINISHED. 
9730: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9740: 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
9750: 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72    );..  /* Regar
9760: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72  dless of the cur
9770: 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65  rent state, a te
9780: 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69  mp-file connecti
9790: 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65  on always behave
97a0: 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20  s.  ** as if it 
97b0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
97c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
97d0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e  abase file. It n
97e0: 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a  ever updates.  *
97f0: 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  * the change-cou
9800: 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74  nter field, so t
9810: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
9820: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
9830: 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s set..  */.  as
9840: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9850: 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b  e==0 || p->eLock
9860: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9870: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9880: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9890: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
98a0: 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a  untDone );..  /*
98b0: 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e   If the useJourn
98c0: 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  al flag is clear
98d0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  , the journal-mo
98e0: 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22  de must be "OFF"
98f0: 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74  . .  ** And if t
9900: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9910: 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f  is "OFF", the jo
9920: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9930: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a  not be open..  *
9940: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  /.  assert( p->j
9950: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9960: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9970: 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e  F || p->useJourn
9980: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
9990: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  p->journalMode!=
99a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
99b0: 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e  E_OFF || !isOpen
99c0: 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  (p->jfd) );..  /
99d0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d  * Check that MEM
99e0: 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e  DB implies noSyn
99f0: 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d  c. And an in-mem
9a00: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e  ory journal. Sin
9a10: 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65  ce .  ** this me
9a20: 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ans an in-memory
9a30: 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20   pager performs 
9a40: 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74  no IO at all, it
9a50: 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65   cannot encounte
9a60: 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53  r .  ** either S
9a70: 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
9a80: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e  QLITE_FULL durin
9a90: 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68  g rollback or wh
9aa0: 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a  ile finalizing .
9ab0: 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66    ** a journal f
9ac0: 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74  ile. (although t
9ad0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  he in-memory jou
9ae0: 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rnal implementat
9af0: 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65  ion may .  ** re
9b00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
9b10: 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68  R_NOMEM while th
9b20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9b30: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29  s being written)
9b40: 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  . It .  ** is th
9b50: 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73  erefore not poss
9b60: 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ible for an in-m
9b70: 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65  emory pager to e
9b80: 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a  nter the ERROR .
9b90: 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f    ** state..  */
9ba0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
9bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9bc0: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
9bd0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9be0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9bf0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9c00: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9c10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9c20: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9c30: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
9c40: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
9c50: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
9c60: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
9c70: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
9c80: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
9c90: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
9ca0: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
9cb0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
9cc0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
9cd0: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
9ce0: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
9cf0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
9d00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
9d10: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
9d20: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
9d30: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9d40: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9d50: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
9d60: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
9d70: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
9d80: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
9d90: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
9da0: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
9db0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9dc0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9dd0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9de0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9df0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
9e00: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
9e10: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
9e20: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
9e30: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9e40: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
9e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9e60: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9e70: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e80: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9e90: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9ea0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9eb0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
9ec0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
9ed0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9ee0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9ef0: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
9f00: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9f10: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9f20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f30: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f40: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9f50: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9f60: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9f70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9f80: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9f90: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
9fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9fb0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
9fc0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
9fd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9fe0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9ff0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a000: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a010: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a020: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a030: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a040: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a050: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a060: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a070: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a080: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a090: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a0a0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a0b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a0c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a0d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a0e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a0f0: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a100: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a110: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a120: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a130: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a140: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a150: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a160: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a170: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a180: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a190: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a1a0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a1b0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a1c0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a1d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a1e0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a1f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a200: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a210: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a220: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a230: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a240: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a250: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a260: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a270: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a280: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a2a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a2b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a2c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a2e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a2f0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a300: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a310: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a320: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a330: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a340: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a350: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a360: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a370: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
a380: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a390: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a3a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a3b0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a3c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a3d0: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a3e0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a400: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
a410: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a420: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a430: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a440: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a450: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a460: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a470: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a480: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a490: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a4a0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a4b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4c0: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
a4d0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a4e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a4f0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a500: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
a510: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a520: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a530: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a540: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a550: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a560: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a570: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a580: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a590: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a5a0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a5b0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a5c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a5d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a5e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a5f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a600: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a610: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a620: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a630: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
a640: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
a650: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
a660: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
a670: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
a680: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
a690: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
a6a0: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
a6b0: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
a6c0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
a6d0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
a6e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
a6f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a700: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a710: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
a720: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a730: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
a740: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
a750: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
a760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a770: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  }..  return 1;.}
a780: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
a790: 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  f NDEBUG */..#if
a7a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a7b0: 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61   ./*.** Return a
a7c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75   pointer to a hu
a7d0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72  man readable str
a7e0: 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20  ing in a static 
a7f0: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
a800: 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f  ning the state o
a810: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
a820: 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  ct passed as an 
a830: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  argument. This.*
a840: 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  * is intended to
a850: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
a860: 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65  debuggers. For e
a870: 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c  xample, as an al
a880: 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20  ternative.** to 
a890: 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20  "print *pPager" 
a8a0: 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67  in gdb:.**.** (g
a8b0: 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c  db) printf "%s",
a8c0: 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61   print_pager_sta
a8d0: 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74  te(pPager).*/.st
a8e0: 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74  atic char *print
a8f0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
a900: 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63  er *p){.  static
a910: 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d   char zRet[1024]
a920: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
a930: 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74  rintf(1024, zRet
a940: 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d  ,.      "Filenam
a950: 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20  e:      %s\n".  
a960: 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20      "State:     
a970: 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25      %s errCode=%
a980: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b  d\n".      "Lock
a990: 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22  :          %s\n"
a9a0: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20  .      "Locking 
a9b0: 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d  mode:  locking_m
a9c0: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
a9d0: 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20  "Journal mode:  
a9e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c  journal_mode=%s\
a9f0: 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e  n".      "Backin
aa00: 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c  g store: tempFil
aa10: 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73  e=%d memDb=%d us
aa20: 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20  eJournal=%d\n". 
aa30: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20       "Journal:  
aa40: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d       journalOff=
aa50: 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d  %lld journalHdr=
aa60: 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53  %lld\n".      "S
aa70: 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62  ize:          db
aa80: 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69  size=%d dbOrigSi
aa90: 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65  ze=%d dbFileSize
aaa0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70  =%d\n".      , p
aab0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20  ->zFilename.    
aac0: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
aad0: 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20  AGER_OPEN       
aae0: 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a       ? "OPEN" :.
aaf0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ab00: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
ab10: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
ab20: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
ab30: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ab40: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f  RITER_LOCKED   ?
ab50: 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22   "WRITER_LOCKED"
ab60: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ab70: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ab80: 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57  ER_CACHEMOD ? "W
ab90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20  RITER_CACHEMOD" 
aba0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
abb0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
abc0: 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52  R_DBMOD    ? "WR
abd0: 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20  ITER_DBMOD" :.  
abe0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
abf0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
ac00: 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52  NISHED ? "WRITER
ac10: 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20  _FINISHED" :.   
ac20: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ac30: 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20  PAGER_ERROR     
ac40: 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20        ? "ERROR" 
ac50: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
ac60: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43    , (int)p->errC
ac70: 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ode.      , p->e
ac80: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20  Lock==NO_LOCK   
ac90: 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b        ? "NO_LOCK
aca0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acb0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
acc0: 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45  OCK   ? "RESERVE
acd0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ace0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
acf0: 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53  _LOCK  ? "EXCLUS
ad00: 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70  IVE" :.        p
ad10: 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
ad20: 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52  LOCK     ? "SHAR
ad30: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ad40: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
ad50: 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f  LOCK    ? "UNKNO
ad60: 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  WN" : "?error?".
ad70: 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75        , p->exclu
ad80: 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c  siveMode ? "excl
ad90: 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c  usive" : "normal
ada0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  ".      , p->jou
adb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
adc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
add0: 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20  RY   ? "memory" 
ade0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
adf0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ae00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ae10: 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20       ? "off" :. 
ae20: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ae30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ae40: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
ae50: 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20    ? "delete" :. 
ae60: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
ae70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ae80: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
ae90: 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a    ? "persist" :.
aea0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
aeb0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aec0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
aed0: 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20  TE ? "truncate" 
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 57 41 4c 20  JOURNALMODE_WAL 
af10: 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22       ? "wal" : "
af20: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
af30: 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c   (int)p->tempFil
af40: 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62  e, (int)p->memDb
af50: 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75  , (int)p->useJou
af60: 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e  rnal.      , p->
af70: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a  journalOff, p->j
af80: 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
af90: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65  , (int)p->dbSize
afa0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67  , (int)p->dbOrig
afb0: 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62  Size, (int)p->db
afc0: 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20  FileSize.  );.. 
afd0: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
afe0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
aff0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
b000: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
b010: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
b020: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b030: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
b040: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
b050: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
b060: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
b070: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
b080: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
b090: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
b0a0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
b0b0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b0c0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
b0d0: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
b0e0: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
b0f0: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
b100: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
b110: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
b120: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
b130: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
b140: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
b150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b160: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
b170: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
b180: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
b190: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
b1a0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
b1b0: 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  ;.  Pgno pgno;. 
b1c0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
b1d0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
b1e0: 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70   ){.    pgno = p
b1f0: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 66 6f  Pg->pgno;.    fo
b200: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b210: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b220: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 26 70 50  ){.      p = &pP
b230: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
b240: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
b250: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b260: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b270: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
b280: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
b290: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
b2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b2b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
b2c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b2d0: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
b2e0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
b2f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b300: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b310: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
b320: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
b330: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
b340: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
b350: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b360: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
b370: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
b380: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
b390: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
b3a0: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
b3b0: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
b3c0: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
b3d0: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
b3e0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
b3f0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
b400: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
b410: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b420: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
b430: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
b440: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
b450: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
b460: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
b470: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
b480: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
b490: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
b4a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b4b0: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
b4c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
b4d0: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
b4e0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
b4f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b500: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
b510: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
b520: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
b530: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b540: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
b550: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
b560: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
b570: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
b580: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
b590: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
b5a0: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
b5b0: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a  ((u8*)A,B).../*.
b5c0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b5d0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
b5e0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
b5f0: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
b600: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
b610: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
b620: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
b630: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
b640: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
b650: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
b660: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b670: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b680: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
b690: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
b6a0: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
b6b0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
b6c0: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
b6d0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  set);.}../*.** U
b6e0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
b6f0: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b700: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b710: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
b720: 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45  LOCK.** or SHARE
b730: 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65  D_LOCK. Regardle
b740: 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
b750: 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f   not the call to
b760: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75   xUnlock().** su
b770: 63 63 65 65 64 73 2c 20 73 65 74 20 74 68 65 20  cceeds, set the 
b780: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
b790: 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68  able to match th
b7a0: 65 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65  e (attempted) ne
b7b0: 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78  w lock..**.** Ex
b7c0: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
b7d0: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
b7e0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
b7f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
b800: 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20  s.** called, do 
b810: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53  not modify it. S
b820: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
b830: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
b840: 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f   of .** UNKNOWN_
b850: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
b860: 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e  anation of this.
b870: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b880: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67  agerUnlockDb(Pag
b890: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b8a0: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
b8b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
b8c0: 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
b8d0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
b8e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
b8f0: 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73  ==eLock );.  ass
b900: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ert( eLock==NO_L
b910: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48  OCK || eLock==SH
b920: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
b930: 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f  ssert( eLock!=NO
b940: 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73  _LOCK || pagerUs
b950: 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
b960: 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
b970: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
b980: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b990: 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20  r->eLock>=eLock 
b9a0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
b9b0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
b9c0: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
b9d0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b9e0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
b9f0: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
ba00: 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38  ger->eLock = (u8
ba10: 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  )eLock;.    }.  
ba20: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
ba30: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
ba40: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d  ger, eLock)).  }
ba50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ba60: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
ba70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
ba80: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
ba90: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
baa0: 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a  er SHARED_LOCK,.
bab0: 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  ** RESERVED_LOCK
bac0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
bad0: 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65  CK. If the calle
bae0: 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  r is successful,
baf0: 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65   set the.** Page
bb00: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
bb10: 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b   to the new lock
bb20: 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  ing state. .**.*
bb30: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
bb40: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
bb50: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
bb60: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
bb70: 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64  on is .** called
bb80: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
bb90: 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65  it unless the ne
bba0: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  w locking state 
bbb0: 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  is EXCLUSIVE_LOC
bbc0: 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63  K. .** See the c
bbd0: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
bbe0: 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e   #define of UNKN
bbf0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
bc00: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20  explanation .** 
bc10: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
bc20: 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b  ic int pagerLock
bc30: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
bc40: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
bc50: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bc60: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  OK;..  assert( e
bc70: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
bc80: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45  K || eLock==RESE
bc90: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  RVED_LOCK || eLo
bca0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
bcb0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
bcc0: 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20  er->eLock<eLock 
bcd0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
bce0: 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
bcf0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
bd00: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
bd10: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
bd20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bd30: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
bd40: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
bd50: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
bd60: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
bd70: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
bd80: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
bd90: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
bda0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
bdb0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
bdc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bdd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
bde0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
bdf0: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
be00: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
be10: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
be20: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
be30: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
be40: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
be50: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
be60: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
be70: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
be80: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
be90: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
bea0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
beb0: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
bec0: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
bed0: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
bee0: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
bef0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
bf00: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
bf10: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
bf20: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
bf30: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
bf40: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
bf50: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
bf60: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
bf70: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
bf80: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
bf90: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
bfa0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
bfb0: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
bfc0: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
bfd0: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
bfe0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
bff0: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c000: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c010: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c020: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c030: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c040: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c050: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c060: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c070: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c080: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c090: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c0a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c0b0: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c0c0: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c0d0: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c0e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c0f0: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c100: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c110: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c120: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c150: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c160: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c190: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c1a0: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1c0: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c1d0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c1e0: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c1f0: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c200: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c210: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c220: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c230: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c240: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c250: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c260: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c270: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c280: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c290: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c2a0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c2b0: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c2c0: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c2d0: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c2e0: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c2f0: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c300: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c320: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c330: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c340: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c350: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c360: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c370: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
c380: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
c390: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
c3a0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c3b0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
c3c0: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
c3d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
c3e0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c3f0: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
c400: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
c410: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c420: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
c430: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
c440: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
c450: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
c460: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c470: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
c480: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
c490: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
c4a0: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
c4b0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c4c0: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
c4d0: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
c4e0: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
c4f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
c500: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
c510: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
c520: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c530: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
c540: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
c550: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c560: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
c570: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
c580: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
c590: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c5a0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c5b0: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
c5c0: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c5d0: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
c5e0: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
c5f0: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
c600: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
c610: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
c620: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
c630: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
c640: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
c650: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c660: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
c670: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
c680: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
c690: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
c6a0: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
c6b0: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
c6c0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
c6d0: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
c6e0: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
c6f0: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
c700: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
c710: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
c720: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
c730: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
c740: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
c750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
c760: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
c770: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
c780: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
c790: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
c7a0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
c7b0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
c7c0: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
c7d0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
c7e0: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
c7f0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
c800: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
c810: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
c820: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
c830: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
c840: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
c850: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
c860: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
c870: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
c880: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
c890: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
c8a0: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
c8b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c8c0: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
c8d0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
c8e0: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
c8f0: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
c900: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
c910: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
c920: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
c930: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
c940: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
c950: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
c960: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
c970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c980: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
c990: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
c9a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
c9b0: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
c9c0: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
c9d0: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
c9e0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
c9f0: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
ca00: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
ca10: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
ca20: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
ca30: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
ca40: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
ca50: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
ca60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
ca70: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
ca80: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
ca90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
caa0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
cab0: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
cac0: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
cad0: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
cae0: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
caf0: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
cb00: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
cb10: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
cb20: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
cb30: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
cb40: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cb50: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
cb60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
cb70: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
cb80: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
cb90: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
cba0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
cbb0: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
cbc0: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
cbd0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
cbe0: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
cbf0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
cc00: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
cc10: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
cc20: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
cc30: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
cc40: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cc50: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
cc60: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
cc70: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
cc80: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
cc90: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
cca0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
ccb0: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
ccc0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
ccd0: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
cce0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
ccf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
cd00: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
cd10: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
cd20: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
cd30: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
cd40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
cd70: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd90: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
cda0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
cdb0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
cdc0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
cdd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
cde0: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
cdf0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
ce00: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
ce10: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
ce20: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
ce30: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
ce40: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
ce50: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce70: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
ce80: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
ce90: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
cea0: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
ceb0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
cec0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
ced0: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
cee0: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
cef0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
cf00: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
cf10: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
cf20: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
cf30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
cf40: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
cf50: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
cf60: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
cf70: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30  er .   || len==0
cf80: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
cf90: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cfa0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cfb0: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
cfc0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cfd0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cfe0: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
cff0: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
d000: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
d010: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
d020: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d030: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d040: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
d050: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
d060: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
d070: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d080: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
d090: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
d0a0: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
d0b0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
d0c0: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
d0d0: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
d0e0: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
d0f0: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
d100: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
d110: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
d120: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
d130: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
d140: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
d150: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
d160: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d170: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
d180: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
d190: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
d1a0: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
d1b0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
d1c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
d1d0: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
d1e0: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d1f0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
d200: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
d210: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
d220: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
d230: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d240: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
d250: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
d260: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
d270: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
d280: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
d290: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
d2a0: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
d2b0: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
d2c0: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
d2d0: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
d2e0: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
d2f0: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
d300: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
d310: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
d320: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
d330: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
d340: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
d350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d370: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d390: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d400: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d410: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d420: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d430: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d440: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d450: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d460: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d470: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d480: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d490: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d4a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d4b0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d4c0: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d4d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d4e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d4f0: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d500: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d510: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d520: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d530: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d540: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d550: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d560: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d570: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d580: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d590: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d5a0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d5b0: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d5c0: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d5d0: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d5e0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d5f0: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d600: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d610: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d620: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d630: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d640: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d650: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d660: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d670: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d680: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d690: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d6a0: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d6b0: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d6c0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d6d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d6e0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d6f0: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d700: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d710: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d720: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d730: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d740: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d750: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d760: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d770: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d780: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d790: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d7a0: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d7b0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d7c0: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d7d0: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d7e0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d7f0: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d800: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d810: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d820: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d830: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d840: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d850: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d860: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d870: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d880: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d890: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d8a0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d8b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d8c0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
d8d0: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d8e0: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d8f0: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
d900: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
d910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
d930: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
d940: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d950: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
d960: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d970: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
d9a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
d9b0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
d9c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
d9d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
d9e0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
d9f0: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
da00: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
da10: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
da20: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
da30: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
da40: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
da50: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
da60: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
da70: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
da80: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
da90: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
daa0: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
dab0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
dac0: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
dad0: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
dae0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
daf0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
db00: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
db10: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
db20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
db30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
db40: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
db50: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
db60: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
db70: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
db80: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
db90: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
dba0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
dbb0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
dbc0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
dbd0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
dbe0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
dbf0: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
dc00: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
dc10: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
dc20: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
dc30: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
dc40: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
dc50: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
dc60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
dc70: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
dc80: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
dc90: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
dca0: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
dcb0: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
dcc0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
dcd0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
dce0: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
dcf0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
dd00: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
dd10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dd20: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
dd30: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
dd40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dd50: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
dd60: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
dd70: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
dd80: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
dd90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
dda0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
ddb0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
ddc0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
ddd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
dde0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ddf0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
de00: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
de10: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
de20: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
de30: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
de40: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
de50: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
de60: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
de70: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
de80: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
de90: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
dea0: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
deb0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
dec0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
ded0: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
dee0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
def0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
df00: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
df10: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
df20: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
df30: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
df40: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
df50: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
df60: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
df70: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
df80: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
df90: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
dfa0: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
dfb0: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
dfc0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
dfd0: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
dfe0: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
dff0: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e000: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e010: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e020: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e030: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e040: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e050: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e060: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e070: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e080: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e0a0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e0b0: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e0c0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e0d0: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e0e0: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e0f0: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e100: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e110: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e120: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e130: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e140: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e150: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e180: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e190: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e1a0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e1c0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e1d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e1e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e1f0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e200: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e210: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e220: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e230: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e240: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e250: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e260: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e270: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e280: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e290: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e2a0: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e2b0: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e2c0: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e2d0: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e2e0: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e2f0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e300: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e310: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
e320: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
e330: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
e340: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
e350: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
e360: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
e370: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
e380: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
e390: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e3a0: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e3b0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e3c0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e3d0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e3e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e3f0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e400: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e410: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e420: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e430: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e440: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e450: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e460: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e470: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e480: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e490: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e4a0: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e4b0: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e4c0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e4d0: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e4e0: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e4f0: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e500: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e510: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e520: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e530: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e540: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e550: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e560: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e570: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e580: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e590: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e5a0: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e5b0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e5c0: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e5d0: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e5e0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e5f0: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e610: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e620: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e630: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e640: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e650: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e660: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e670: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e680: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e690: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e6a0: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e6b0: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e6c0: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e6d0: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e6e0: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e6f0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e700: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e710: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e720: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e730: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e740: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e750: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e760: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e770: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e780: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e790: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e7a0: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e7b0: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e7c0: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e7d0: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e7e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e7f0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e800: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e810: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e820: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e830: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e840: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e850: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e860: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e870: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e880: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e890: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e8a0: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e8b0: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e8c0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
e8d0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
e8e0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
e8f0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
e900: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e910: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e920: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
e930: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
e940: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
e950: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
e960: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e970: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
e980: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
e990: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
e9a0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
e9b0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
e9c0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e9d0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
e9e0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
e9f0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ea00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ea10: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
ea20: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
ea30: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
ea40: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
ea50: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
ea60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
ea70: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
ea80: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
ea90: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
eaa0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
eab0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
eac0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
ead0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
eae0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
eaf0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
eb00: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
eb10: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
eb20: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb30: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eb40: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
eb50: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
eb60: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
eb70: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
eb80: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
eb90: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
eba0: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
ebb0: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
ebc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
ebd0: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
ebe0: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
ebf0: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
ec00: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
ec10: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
ec20: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
ec30: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
ec40: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
ec50: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
ec60: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
ec70: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ec80: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
ec90: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
eca0: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
ecb0: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
ecc0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
ecd0: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
ece0: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
ecf0: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
ed00: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
ed10: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
ed20: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
ed30: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
ed40: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
ed50: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
ed60: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
ed70: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
ed80: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
ed90: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
eda0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
edb0: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
edc0: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
edd0: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
ede0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
edf0: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
ee00: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
ee10: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
ee20: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
ee30: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
ee40: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
ee50: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
ee60: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
ee70: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
ee80: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
ee90: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
eea0: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
eeb0: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
eec0: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
eed0: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
eee0: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
eef0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
ef00: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
ef10: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
ef20: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
ef30: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
ef40: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
ef50: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
ef60: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
ef70: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
ef80: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
ef90: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
efa0: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
efb0: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
efc0: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
efd0: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
efe0: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
eff0: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f000: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f010: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f020: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f030: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f040: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f050: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f060: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f070: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f080: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f090: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f0a0: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f0b0: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f0c0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f0d0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f0e0: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f0f0: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f100: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f110: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f120: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f130: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f140: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f150: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f160: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f170: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f180: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f190: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f1a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f1b0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f1c0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f1d0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f1e0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f1f0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f200: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f210: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f220: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f230: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f240: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f250: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f260: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f270: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f280: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f290: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f2a0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f2b0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f2c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f2d0: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f2e0: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f2f0: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f300: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f310: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
f320: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
f330: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
f340: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
f350: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
f360: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
f370: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
f380: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
f390: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f3a0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f3b0: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f3c0: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f3d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f3e0: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f3f0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f400: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f410: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f420: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f430: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f440: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f450: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f460: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f470: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f480: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f490: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f4a0: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f4b0: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f4c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f4d0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f4e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f4f0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f500: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f510: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f520: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f530: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f540: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f550: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f560: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f570: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f580: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f590: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f5a0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f5b0: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f5c0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f5e0: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f5f0: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f600: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f610: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f620: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f630: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f640: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f650: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f660: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f680: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f690: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f6a0: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f6b0: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f6c0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f6d0: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f6f0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f700: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f710: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f720: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f730: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f740: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f750: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f760: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f770: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f780: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f790: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f7a0: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f7b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f7c0: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f7d0: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f7e0: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f7f0: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f810: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f820: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f830: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f840: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f850: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f860: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f870: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f880: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f890: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f8a0: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f8b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f8c0: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
f8d0: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
f8e0: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
f8f0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
f900: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
f910: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
f920: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
f930: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
f940: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
f950: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
f960: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
f970: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f980: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
f990: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
f9a0: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
f9b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
f9c0: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
f9d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f9e0: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
f9f0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
fa00: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
fa10: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
fa20: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
fa30: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
fa40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fa50: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
fa60: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
fa70: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
fa80: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
fa90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
faa0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fab0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
fac0: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
fad0: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
fae0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
faf0: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
fb00: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
fb10: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
fb20: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
fb30: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
fb40: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
fb50: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
fb60: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
fb70: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
fb80: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
fb90: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fba0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fbb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fbc0: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
fbd0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fbe0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fbf0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc00: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
fc10: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
fc20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fc30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc50: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
fc60: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
fc70: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
fc80: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
fc90: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
fca0: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fcc0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
fcd0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fce0: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
fcf0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
fd00: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
fd10: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
fd20: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
fd30: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
fd40: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fd50: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
fd60: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
fd70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
fd80: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fd90: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fda0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
fdb0: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
fdc0: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
fdd0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fde0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fdf0: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
fe00: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
fe10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fe20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fe30: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
fe40: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
fe50: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
fe60: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
fe70: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
fe80: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
fe90: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
fea0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
feb0: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
fec0: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
fed0: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
fee0: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
fef0: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
ff00: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
ff10: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
ff20: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
ff30: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
ff40: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
ff50: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
ff60: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
ff70: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
ff80: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
ff90: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
ffa0: 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
ffb0: 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
ffc0: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
ffd0: 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
ffe0: 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
fff0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
10000 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
10010 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10020 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10030 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
10040 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
10050 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10060 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
10090 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
100a0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
100b0 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
100c0 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
100d0 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
100e0 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
100f0 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
10100 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
10110 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10120 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10130 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
10140 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
10150 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
10160 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
10170 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
10180 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
10190 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
101a0 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
101b0 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
101c0 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
101d0 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
101e0 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
101f0 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
10200 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
10210 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10220 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10230 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10250 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
10260 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
10270 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
10280 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
10290 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
102a0 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
102b0 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
102c0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
102d0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
102e0 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
102f0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10300 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10310 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10320 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10330 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
10340 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
10350 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
10360 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
10370 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
10380 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
10390 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
103a0 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
103b0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
103c0 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
103d0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
103e0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
103f0 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10400 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10410 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10420 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10430 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
10440 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
10450 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
10460 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
10470 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
10480 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
10490 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
104a0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
104b0 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
104c0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
104d0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
104e0 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
104f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10500 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10510 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10530 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
10540 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
10550 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
10560 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
10570 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
10580 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
10590 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
105a0 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
105b0 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
105c0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
105d0 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
105e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
105f0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10600 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10610 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10620 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10630 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
10640 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
10650 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
10660 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
10670 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
10680 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
10690 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
106a0 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
106b0 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
106c0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
106d0 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
106e0 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
106f0 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10700 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10710 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10720 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10730 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
10740 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
10750 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
10760 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
10770 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
10780 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10790 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
107a0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
107b0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
107c0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
107d0 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
107e0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
107f0 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10800 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10810 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10820 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10830 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
10840 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
10850 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
10860 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
10870 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
10880 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
10890 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
108a0 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
108b0 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
108c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
108f0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10910 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10920 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10930 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
10940 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
10950 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10960 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
10970 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
10980 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
109b0 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
109c0 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
109d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
109e0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
109f0 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10a00 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10a10 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10a20 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10a30 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10a40 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
10a50 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
10a60 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
10a70 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
10a80 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
10a90 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  RY .   || pPager
10aa0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
10ab0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10ac0 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72  _OFF .  ){.    r
10ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ae0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
10af0 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20  etMaster = 1;.  
10b00 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
10b10 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
10b20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10b30 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10b40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10b50 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10b60 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10b70 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10b80 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10b90 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10ba0 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10bb0 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10bc0 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10bd0 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10be0 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10bf0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10c00 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10c10 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10c20 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10c30 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
10c40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10c50 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10c60 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10c70 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10c80 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10c90 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10ca0 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10cb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10cc0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10cd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10ce0 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10cf0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10d00 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10d10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10d20 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10d30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10d40 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
10d50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10d60 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
10d70 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10d80 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
10d90 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10da0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
10db0 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
10dc0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10dd0 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
10de0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
10df0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10e00 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
10e10 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
10e20 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
10e30 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
10e40 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10e50 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10e60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10e70 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
10e80 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
10e90 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10ea0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10eb0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
10ec0 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
10ed0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10ef0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
10f00 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
10f10 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
10f20 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
10f30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10f40 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
10f50 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
10f60 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  er+20);..  /* If
10f70 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10f80 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e   peristent-journ
10f90 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  al mode, then th
10fa0 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a  e physical .  **
10fb0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61   journal-file ma
10fc0 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  y extend past th
10fd0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73  e end of the mas
10fe0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
10ff0 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65  .  ** and 8 byte
11000 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20  s of magic data 
11010 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20  just written to 
11020 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
11030 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75  s .  ** dangerou
11040 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  s because the co
11050 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  de to rollback a
11060 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
11070 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
11080 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  be able to find 
11090 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
110a0 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  al name to deter
110b0 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
110c0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
110d0 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20  urnal is hot. . 
110e0 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74   **.  ** Easiest
110f0 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20   thing to do in 
11100 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73  this scenario is
11110 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
11120 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
11130 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69  ile to the requi
11140 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a  red size..  */ .
11150 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
11160 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
11170 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
11180 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
11190 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  ).   && jrnlSize
111a0 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  >pPager->journal
111b0 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
111c0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
111d0 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
111e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
111f0 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Off);.  }.  retu
11200 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11210 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
11220 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
11230 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
11240 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  ber. Return.** a
11250 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
11260 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
11270 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
11280 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c  ge is not .** al
11290 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e  ready in memory.
112a0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
112b0 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
112c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
112d0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
112e0 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11300 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
11310 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
11320 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
11330 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65  call to PcacheFe
11340 74 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74  tch() with creat
11350 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a  eFlag==0 to.  **
11360 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20   fail, since no 
11370 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
11380 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  ate dynamic memo
11390 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e  ry will be made.
113a0 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
113b0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
113c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
113d0 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a  , pgno, 0, &p);.
113e0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
113f0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
11400 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11410 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
11420 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
11430 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11440 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
11450 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
11460 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
11470 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
11480 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
11490 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
114a0 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
114b0 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
114c0 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
114d0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
114e0 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
114f0 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
11500 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
11510 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
11520 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
11530 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
11540 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
11550 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
11560 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11570 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
11580 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
11590 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
115a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
115b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
115c0 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
115d0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
115e0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
115f0 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
11600 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
11610 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
11620 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11630 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
11640 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
11650 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
11660 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
11670 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
11680 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
11690 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66  rnal(pPager->sjf
116a0 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
116b0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
116c0 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >sjfd);.  }.  sq
116d0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
116e0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r->aSavepoint);.
116f0 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
11700 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
11710 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
11720 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11730 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ubRec = 0;.}../*
11740 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
11750 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
11760 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
11770 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a  t.pInSavepoint .
11780 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c  ** bitvecs of al
11790 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
117a0 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  s. Return SQLITE
117b0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
117c0 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  l.** or SQLITE_N
117d0 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
117e0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
117f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
11800 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
11810 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
11820 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
11830 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11850 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
11860 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11870 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  _OK;       /* Re
11880 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  sult code */..  
11890 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
118a0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
118b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65   ii++){.    Page
118c0 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
118d0 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
118e0 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  int[ii];.    if(
118f0 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20   pgno<=p->nOrig 
11900 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73  ){.      rc |= s
11910 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
11920 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
11930 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65   pgno);.      te
11940 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
11950 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
11960 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
11970 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
11980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11990 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
119a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
119b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
119c0 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
119d0 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
119e0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f  sive mode and no
119f0 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f  t.** in the ERRO
11a00 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
11a10 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20  se, it switches 
11a20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47  the pager to PAG
11a30 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65  ER_OPEN.** state
11a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
11a50 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
11a60 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
11a70 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61  mode, the databa
11a80 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f  se file is.** co
11a90 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65  mpletely unlocke
11aa0 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  d. If the file i
11ab0 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74  s unlocked and t
11ac0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  he file-system d
11ad0 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62  oes.** not exhib
11ae0 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42  it the UNDELETAB
11af0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f  LE_WHEN_OPEN pro
11b00 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e  perty, the journ
11b10 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c  al file is.** cl
11b20 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f  osed (if it is o
11b30 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pen)..**.** If t
11b40 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45  he pager is in E
11b50 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
11b60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
11b70 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a   called, the .**
11b80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11b90 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65   pager cache are
11ba0 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72   discarded befor
11bb0 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b  e switching back
11bc0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e   to .** the OPEN
11bd0 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65   state. Regardle
11be0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
11bf0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11c00 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20  clusive-mode.** 
11c10 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72  or not, any jour
11c20 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e  nal file left in
11c30 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
11c40 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
11c50 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  .** as a hot-jou
11c60 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
11c70 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69  back the next ti
11c80 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  me a read-transa
11c90 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e  ction.** is open
11ca0 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62  ed (by this or b
11cb0 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e  y any other conn
11cc0 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74  ection)..*/.stat
11cd0 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
11ce0 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
11cf0 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  er){..  assert( 
11d00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11d10 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
11d20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
11d30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
11d40 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  EN .       || pP
11d50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
11d60 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a  GER_ERROR .  );.
11d70 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
11d80 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
11d90 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
11da0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
11db0 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  l = 0;.  release
11dc0 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
11dd0 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61  ager);..  if( pa
11de0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
11df0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
11e00 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
11e10 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c  >jfd) );.    sql
11e20 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
11e30 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
11e40 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61  ->pWal);.    pPa
11e50 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
11e60 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GER_OPEN;.  }els
11e70 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
11e80 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
11e90 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
11ec0 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65  returned by page
11ed0 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20  rUnlockDb() */. 
11ee0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f     int iDc = isO
11ef0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f  pen(pPager->fd)?
11f00 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
11f10 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
11f20 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20  Pager->fd):0;.. 
11f30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65     /* If the ope
11f40 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75  rating system su
11f50 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f  pport deletion o
11f60 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68  f open files, th
11f70 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20  en.    ** close 
11f80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11f90 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
11fa0 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
11fb0 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  .  Otherwise.   
11fc0 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   ** another conn
11fd0 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
11fe0 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
11ff0 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65  might delete the
12000 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74   file.    ** out
12010 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
12020 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12030 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12040 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26  LMODE_MEMORY   &
12050 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12060 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12070 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
12080 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12090 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
120a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
120b0 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
120c0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
120d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
120e0 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20  ELETE   & 5)!=1 
120f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12100 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12110 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d  E_TRUNCATE & 5)=
12120 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12130 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12140 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20  MODE_PERSIST  & 
12150 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  5)==1 );.    if(
12160 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54   0==(iDc & SQLIT
12170 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
12180 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20  BLE_WHEN_OPEN). 
12190 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65      || 1!=(pPage
121a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26  r->journalMode &
121b0 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   5).    ){.     
121c0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
121d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
121e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
121f0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
12200 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
12210 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  nd the call to u
12220 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
12230 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66  se.    ** file f
12240 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75  ails, set the cu
12250 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e  rrent lock to UN
12260 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
12270 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20  the comment.    
12280 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  ** above the #de
12290 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e  fine for UNKNOWN
122a0 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
122b0 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20  lanation of why 
122c0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e  this.    ** is n
122d0 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
122e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
122f0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
12300 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  NO_LOCK);.    if
12310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12320 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
12330 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e==PAGER_ERROR )
12340 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
12350 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f  eLock = UNKNOWN_
12360 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LOCK;.    }..   
12370 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74   /* The pager st
12380 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67  ate may be chang
12390 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52  ed from PAGER_ER
123a0 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ROR to PAGER_OPE
123b0 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69  N here.    ** wi
123c0 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74  thout clearing t
123d0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  he error code. T
123e0 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e  his is intention
123f0 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20  al - the error. 
12400 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c     ** code is cl
12410 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61  eared and the ca
12420 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65  che reset in the
12430 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20   block below..  
12440 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
12450 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12460 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
12470 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
12480 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
12490 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
124a0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
124b0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
124c0 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PEN;.  }..  /* I
124d0 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
124e0 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
124f0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12500 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
12510 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20  e.  ** trusted. 
12520 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61  Now that there a
12530 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
12540 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
12550 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20  the pager,.  ** 
12560 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f  it can safely mo
12570 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ve back to PAGER
12580 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69  _OPEN state. Thi
12590 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74  s happens in bot
125a0 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e  h.  ** normal an
125b0 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  d exclusive-lock
125c0 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing mode..  */. 
125d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
125e0 43 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Code ){.    asse
125f0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
12600 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
12610 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
12620 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12630 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
12640 70 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65  pFile;.    pPage
12650 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12660 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67  R_OPEN;.    pPag
12670 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
12680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28  LITE_OK;.    if(
12690 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
126a0 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66  ) ) sqlite3OsUnf
126b0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
126c0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 70   0, 0);.  }..  p
126d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
126e0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
126f0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
12700 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
12710 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
12720 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12730 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
12740 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
12750 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
12760 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
12770 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
12780 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
12790 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
127a0 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
127b0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
127c0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
127d0 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
127e0 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
127f0 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
12800 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
12810 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
12820 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
12830 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
12840 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
12850 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
12860 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
12870 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
12880 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
12890 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
128a0 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
128b0 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
128c0 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
128d0 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
128e0 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
128f0 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
12900 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
12910 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
12920 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
12930 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
12940 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
12950 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
12960 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
12970 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
12980 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
12990 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
129a0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
129b0 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
129c0 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
129d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
129e0 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
129f0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
12a00 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
12a10 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
12a20 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
12a30 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
12a40 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
12a50 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
12a60 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
12a70 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
12a80 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
12a90 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
12aa0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
12ab0 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
12ac0 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
12ad0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
12ae0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
12af0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
12b00 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
12b10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
12b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
12b30 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
12b40 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
12b50 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
12b60 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
12b70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12b80 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
12b90 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
12ba0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12bb0 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
12bc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
12bd0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
12be0 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
12bf0 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
12c00 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
12c10 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
12c20 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
12c30 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
12c40 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
12c50 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
12c60 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12c70 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
12c80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12c90 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
12ca0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
12cb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
12cc0 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a  no nPage);../*.*
12cd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
12ce0 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
12cf0 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  n. A transaction
12d00 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65   is usually ende
12d10 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20  d by .** either 
12d20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
12d30 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e  LLBACK operation
12d40 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
12d50 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a  ay be called .**
12d60 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20   after rollback 
12d70 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
12d80 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
12d90 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
12da0 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75  ening.** the jou
12db0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69  rnal file or wri
12dc0 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69  ting the very fi
12dd0 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
12de0 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62  er of a.** datab
12df0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ase transaction.
12e00 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
12e10 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
12e20 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52  lled in PAGER_ER
12e30 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74  ROR state. If it
12e40 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e   is called.** in
12e50 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50   PAGER_NONE or P
12e60 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
12e70 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68  e and the lock h
12e80 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65  eld is less.** e
12e90 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20  xclusive than a 
12ea0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69  RESERVED lock, i
12eb0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
12ec0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
12ed0 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  ny active savepo
12ee0 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65  ints are release
12ef0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
12f00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12f10 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73  open, then it is
12f20 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e   "finalized". On
12f30 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ce a journal .**
12f40 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66   file has been f
12f50 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e  inalized it is n
12f60 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
12f70 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61  se it to roll ba
12f80 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63  ck a .** transac
12f90 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69  tion. Nor will i
12fa0 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  t be considered 
12fb0 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72  to be a hot-jour
12fc0 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f  nal by this.** o
12fd0 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  r any other data
12fe0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
12ff0 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a   Exactly how a j
13000 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
13010 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f  zed.** depends o
13020 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
13030 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
13040 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
13050 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74  ve mode and.** t
13060 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e  he current journ
13070 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a  al-mode (Pager.j
13080 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65  ournalMode value
13090 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ), as follows:.*
130a0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
130b0 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20  de==MEMORY.**   
130c0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64    Journal file d
130d0 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d  escriptor is sim
130e0 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  ply closed. This
130f0 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a   destroys an .**
13100 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a       in-memory j
13110 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20  ournal..**.**   
13120 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55  journalMode==TRU
13130 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75  NCATE.**     Jou
13140 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75  rnal file is tru
13150 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62  ncated to zero b
13160 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
13170 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13180 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  e==PERSIST.**   
13190 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62    The first 28 b
131a0 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
131b0 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72  nal file are zer
131c0 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69  oed. This invali
131d0 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65  dates.**     the
131e0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
131f0 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c  eader in the fil
13200 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  e, and hence the
13210 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a   entire journal.
13220 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20  **     file. An 
13230 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20  invalid journal 
13240 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  file cannot be r
13250 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
13260 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
13270 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54  =DELETE.**     T
13280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13290 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  is closed and de
132a0 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  leted using sqli
132b0 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
132c0 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20  *.**     If the 
132d0 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
132e0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
132f0 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20  de, this method 
13300 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a  of finalizing.**
13310 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
13320 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75   file is never u
13330 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66  sed. Instead, if
13340 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65   the journalMode
13350 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54   is.**     DELET
13360 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  E and the pager 
13370 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
13380 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64  mode, the method
13390 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72   described under
133a0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d  .**     journalM
133b0 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20  ode==PERSIST is 
133c0 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
133d0 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f  .** After the jo
133e0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
133f0 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f  ed, the pager mo
13400 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41  ves to PAGER_REA
13410 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66  DER state..** If
13420 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
13430 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61  exclusive rollba
13440 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ck mode, the loc
13450 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73  k on the file is
13460 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20   .** downgraded 
13470 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b  to a SHARED_LOCK
13480 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
13490 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
134a0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
134b0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
134c0 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
134d0 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
134e0 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
134f0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
13500 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
13510 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
13520 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
13530 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
13540 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
13550 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
13560 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
13570 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13580 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
13590 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
135a0 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
135b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
135c0 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
135d0 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
135e0 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
135f0 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
13600 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
13610 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
13620 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
13630 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
13640 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
13650 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
13660 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
13670 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
13680 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
13690 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
136a0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
136b0 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43  asMaster, int bC
136c0 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63  ommit){.  int rc
136d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
136e0 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
136f0 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
13700 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
13710 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
13720 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
13730 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
13740 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
13750 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
13760 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69  /..  /* Do nothi
13770 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ng if the pager 
13780 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
13790 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
137a0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20  saction.  ** or 
137b0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
137c0 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66  VED lock. This f
137d0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
137e0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
137f0 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74  .  ** is no writ
13800 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
13810 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52  tive but a RESER
13820 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
13830 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64  ock is.  ** held
13840 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75   under two circu
13850 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20  mstances:.  **. 
13860 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61   **   1. After a
13870 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d   successful hot-
13880 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
13890 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77  , it is called w
138a0 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53  ith.  **      eS
138b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45  tate==PAGER_NONE
138c0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
138d0 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a  USIVE_LOCK..  **
138e0 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20  .  **   2. If a 
138f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
13900 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
13910 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61  lusive holding a
13920 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a  n EXCLUSIVE .  *
13930 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74  *      lock swit
13940 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63  ches back to loc
13950 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c  king_mode=normal
13960 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74   and then execut
13970 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72  es a.  **      r
13980 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ead-transaction,
13990 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
139a0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53  s called with eS
139b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
139c0 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e  ER .  **      an
139d0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
139e0 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  VE_LOCK when the
139f0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13a00 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a  n is closed..  *
13a10 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  /.  assert( asse
13a20 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
13a30 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
13a40 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
13a50 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
13a60 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13a70 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52  >eState<PAGER_WR
13a80 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70  ITER_LOCKED && p
13a90 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53  Pager->eLock<RES
13aa0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
13ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13ac0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61  OK;.  }..  relea
13ad0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
13ae0 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
13af0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
13b00 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
13b10 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
13b20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
13b30 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13b40 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
13b50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13b60 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61   );..    /* Fina
13b70 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
13b80 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
13b90 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  ( sqlite3IsMemJo
13ba0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
13bb0 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
13bc0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
13bd0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13be0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13bf0 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y );.      sqlit
13c00 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13c10 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
13c20 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13c30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13c40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
13c50 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
13c60 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13c70 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
13c80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13c90 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
13ca0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13cb0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
13cc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
13cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13ce0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13cf0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
13d00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13d10 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13d20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
13d30 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
13d40 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
13d50 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
13d60 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
13d70 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
13d80 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
13d90 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
13da0 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
13db0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50  aster);.      pP
13dc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13dd0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
13de0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
13df0 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
13e00 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
13e10 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
13e20 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
13e30 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
13e40 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
13e50 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
13e60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
13e70 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
13e80 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
13e90 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
13ea0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
13eb0 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
13ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13ed0 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
13ee0 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
13ef0 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  ory journal. .  
13f00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
13f10 20 62 44 65 6c 65 74 65 20 3d 20 28 21 70 50 61   bDelete = (!pPa
13f20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
13f30 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 45   sqlite3JournalE
13f40 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  xists(pPager->jf
13f50 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
13f60 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13f70 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13f80 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
13f90 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13fb0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13fc0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
13fd0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
13fe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13ff0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14000 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
14010 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
14020 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14030 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
14040 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
14050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14060 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
14070 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
14080 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
14090 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
140a0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
140b0 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
140c0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
140d0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
140e0 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
140f0 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
14100 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
14110 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
14120 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
14130 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
14140 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
14150 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
14160 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
14170 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
14180 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
14190 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
141a0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a  nrefNotNull(p);.
141b0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
141c0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
141d0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
141e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
141f0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
14200 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  al = 0;.  pPager
14210 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71  ->nRec = 0;.  sq
14220 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
14230 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
14240 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  che);.  sqlite3P
14250 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
14260 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
14270 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
14280 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
14290 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
142a0 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41    /* Drop the WA
142b0 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66  L write-lock, if
142c0 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74   any. Also, if t
142d0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
142e0 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  s in .    ** loc
142f0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
14300 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20  ive mode but is 
14310 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20  no longer, drop 
14320 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20  the EXCLUSIVE . 
14330 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20     ** lock held 
14340 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14350 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
14360 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61   rc2 = sqlite3Wa
14370 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63  lEndWriteTransac
14380 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
14390 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
143a0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
143b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
143c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
143d0 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72  Commit && pPager
143e0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61  ->dbFileSize>pPa
143f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
14400 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
14410 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
14420 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
14430 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c  nsaction in roll
14440 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  back-journal.   
14450 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20   ** mode if the 
14460 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
14470 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20   disk is larger 
14480 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
14490 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20  e image..    ** 
144a0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
144b0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
144c0 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
144d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
144e0 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73   .    ** success
144f0 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c  fully committed,
14500 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49   but the EXCLUSI
14510 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c  VE lock is still
14520 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20   held on the.   
14530 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20   ** file. So it 
14540 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63  is safe to trunc
14550 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
14560 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e   file to its min
14570 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75  imum.    ** requ
14580 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  ired size.  */. 
14590 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
145a0 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
145b0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
145c0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
145d0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
145e0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
145f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14600 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
14610 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
14620 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63  r->fd) ){.    rc
14630 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
14640 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
14650 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
14660 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f  _COMMIT_PHASETWO
14670 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
14680 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
14690 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
146a0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
146b0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
146c0 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70  eMode .   && (!p
146d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
146e0 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c  r) || sqlite3Wal
146f0 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
14700 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a  ager->pWal, 0)).
14710 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70    ){.    rc2 = p
14720 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
14730 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
14740 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
14750 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
14760 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
14770 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
14780 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65  _READER;.  pPage
14790 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
147a0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
147b0 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
147c0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  c);.}../*.** Exe
147d0 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
147e0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
147f0 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
14800 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
14810 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
14820 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
14830 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
14840 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
14850 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
14860 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
14870 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
14880 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
14890 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
148a0 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
148b0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
148c0 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
148d0 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
148e0 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
148f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14900 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  le and move the 
14910 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50  pager back to OP
14920 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  EN state. If thi
14930 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  s .** means that
14940 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d   there is a hot-
14950 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20  journal left in 
14960 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
14970 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f   the next .** co
14980 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  nnection to obta
14990 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
149a0 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77   on the pager (w
149b0 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73  hich may be this
149c0 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72   one) .** will r
149d0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
149e0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
149f0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
14a00 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14a10 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20  R state, but an 
14a20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20  IO or.** malloc 
14a30 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
14a40 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
14a50 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69  then this will i
14a60 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20  tself cause .** 
14a70 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
14a80 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  er the ERROR sta
14a90 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62  te. Which will b
14aa0 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65  e cleared by the
14ab0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14ac0 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64  r_unlock(), as d
14ad0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
14ae0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
14af0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
14b00 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
14b10 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
14b20 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
14b30 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65  R_ERROR && pPage
14b40 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14b50 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73  _OPEN ){.    ass
14b60 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
14b70 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
14b80 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
14b90 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
14ba0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
14bb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
14bc0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
14bd0 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
14be0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
14bf0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
14c00 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
14c10 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73  lloc();.    }els
14c20 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
14c30 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
14c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14c50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
14c60 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
14c70 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
14c80 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
14c90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
14ca0 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
14cb0 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
14cc0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
14cd0 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
14ce0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
14cf0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
14d00 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
14d10 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
14d20 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
14d30 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
14d40 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
14d50 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
14d60 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
14d70 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
14d80 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
14d90 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
14da0 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
14db0 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
14dc0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
14dd0 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
14de0 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
14df0 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
14e00 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
14e10 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
14e20 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
14e30 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
14e40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14e50 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
14e60 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
14e70 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
14e80 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
14e90 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
14ea0 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
14eb0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
14ec0 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
14ed0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
14ee0 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
14ef0 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
14f00 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
14f10 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
14f20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
14f30 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
14f40 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
14f50 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
14f60 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
14f70 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
14f80 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
14f90 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
14fa0 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
14fb0 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
14fc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
14fd0 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
14fe0 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
14ff0 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
15000 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
15010 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
15020 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
15030 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
15040 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
15050 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
15060 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
15070 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
15080 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
15090 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
150a0 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
150b0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
150c0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
150d0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
150e0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
150f0 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
15100 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
15110 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15120 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
15130 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
15140 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
15150 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
15160 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
15170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
15180 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
15190 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
151a0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
151b0 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
151c0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
151d0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
151e0 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
151f0 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
15200 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
15210 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
15220 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
15230 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
15240 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
15250 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
15260 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
15290 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
152a0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
152b0 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
152c0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
152d0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
152e0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
152f0 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  dec */.#endif../
15300 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
15310 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
15320 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
15330 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
15340 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
15350 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
15360 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
15370 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
15380 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
15390 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
153a0 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
153b0 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
153c0 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
153d0 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
153e0 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
153f0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
15400 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
15410 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  al..**.** The ma
15420 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
15430 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75  nal uses checksu
15440 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
15450 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
15460 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  .** not..**.** I
15470 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
15480 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
15490 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
154a0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
154b0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
154c0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
154d0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
154e0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
154f0 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
15500 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
15510 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
15520 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
15530 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
15540 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
15550 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
15560 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
15570 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
15580 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
15590 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
155a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
155b0 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
155c0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
155d0 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
155e0 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
155f0 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
15600 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
15610 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
15620 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
15630 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
15640 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
15650 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
15660 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
15670 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
15680 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
15690 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
156a0 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
156b0 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
156c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
156d0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
156e0 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
156f0 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
15700 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
15710 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
15720 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
15730 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
15740 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
15750 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
15760 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
15770 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
15780 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
15790 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
157a0 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
157b0 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
157c0 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
157d0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
157e0 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
157f0 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
15800 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
15810 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
15820 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
15830 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
15840 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
15850 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
15860 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
15870 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
15880 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
15890 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
158a0 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
158b0 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
158c0 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
158d0 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
158e0 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
158f0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
15900 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
15910 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
15920 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15930 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
15940 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
15950 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
15960 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
15970 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
15980 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
15990 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
159a0 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
159b0 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
159c0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
159d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
159e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
159f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15a00 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
15a10 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
15a20 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
15a30 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15a40 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
15a50 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  ack */.  i64 *pO
15a60 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
15a70 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
15a80 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
15a90 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  ayback */.  Bitv
15aa0 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20  ec *pDone,      
15ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
15ac0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
15ad0 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
15ae0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
15af0 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
15b00 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
15b10 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
15b20 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
15b30 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20   int isSavepnt  
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b50 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
15b60 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15b70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
15b80 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
15bb0 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
15bc0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
15bf0 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
15c00 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
15c10 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c30 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
15c40 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
15c50 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ing */.  char *a
15c60 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
15c70 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
15c80 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
15c90 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
15ca0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15cc0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
15cd0 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
15ce0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
15cf0 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20   isSynced;      
15d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15d10 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61  ue if journal pa
15d20 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  ge is synced */.
15d30 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
15d40 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
15d50 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
15d60 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
15d70 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
15d80 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
15d90 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
15da0 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
15db0 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
15dc0 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
15dd0 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
15de0 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
15df0 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
15e00 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
15e10 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
15e20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
15e30 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
15e40 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
15e50 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
15e60 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
15e70 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
15e80 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
15e90 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
15ea0 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
15eb0 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
15ec0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
15ed0 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
15ee0 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
15ef0 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
15f00 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
15f10 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
15f20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15f30 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
15f40 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
15f50 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15f60 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
15f70 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
15f80 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
15f90 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
15fa0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
15fb0 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
15fc0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
15fd0 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
15fe0 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
15ff0 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
16000 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
16010 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
16020 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
16030 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
16040 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
16050 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
16060 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16070 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
16080 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
16090 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
160a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
160b0 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
160c0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
160d0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
160e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
160f0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
16100 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
16110 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
16120 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
16130 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
16140 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
16150 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
16160 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
16170 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
16180 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
16190 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
161a0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
161b0 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
161c0 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
161d0 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
161e0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
161f0 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
16200 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
16210 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16220 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
16230 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
16240 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
16250 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16260 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
16270 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16280 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16290 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
162a0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
162b0 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
162c0 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
162d0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
162e0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
162f0 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
16300 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
16310 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
16320 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
16330 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
16340 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
16350 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
16360 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
16370 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
16380 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
16390 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
163a0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
163b0 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
163c0 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
163d0 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
163e0 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
163f0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
16400 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
16410 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
16420 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
16430 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
16440 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16450 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
16460 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
16470 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
16480 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
16490 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
164a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
164b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
164c0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
164d0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
164e0 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
164f0 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
16500 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
16510 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
16520 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
16530 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
16540 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
16550 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
16560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
16570 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
16580 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
16590 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
165a0 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72   played by befor
165b0 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
165c0 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
165d0 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
165e0 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
165f0 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
16600 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
16610 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
16620 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
16630 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
16640 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
16650 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
16660 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
16670 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
16680 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
16690 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
166a0 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
166b0 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
166c0 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
166d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
166e0 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
166f0 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
16700 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
16710 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
16720 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
16730 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
16740 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
16750 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
16760 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
16770 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16780 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
16790 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
167a0 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
167b0 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
167c0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
167d0 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
167e0 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
167f0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
16800 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
16810 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
16820 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
16830 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
16840 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
16850 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
16860 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
16870 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
16880 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
16890 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
168a0 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
168b0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
168c0 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
168d0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
168e0 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
168f0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
16900 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
16910 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
16920 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
16930 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
16940 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
16950 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
16960 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
16970 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
16980 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
16990 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
169a0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
169b0 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
169c0 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
169d0 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
169e0 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
169f0 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
16a00 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
16a10 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
16a20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
16a30 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
16a40 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
16a50 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
16a60 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
16a70 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16a80 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
16a90 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
16aa0 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
16ab0 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
16ac0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
16ad0 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
16ae0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
16af0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
16b00 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
16b10 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
16b20 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
16b30 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
16b40 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
16b50 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
16b60 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
16b70 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
16b80 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
16b90 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
16ba0 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
16bb0 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
16bc0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
16bd0 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
16be0 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
16bf0 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
16c00 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
16c10 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
16c20 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
16c30 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
16c40 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
16c50 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
16c60 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
16c70 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
16c80 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
16c90 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
16ca0 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
16cb0 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
16cc0 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
16cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
16ce0 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
16cf0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
16d00 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
16d10 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
16d20 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
16d30 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
16d40 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
16d50 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
16d60 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
16d70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16d80 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
16d90 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
16da0 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
16db0 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
16dc0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
16dd0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
16de0 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
16df0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
16e00 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
16e10 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
16e20 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
16e30 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
16e40 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
16e50 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
16e60 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
16e70 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
16e80 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
16e90 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
16ea0 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
16eb0 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
16ec0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
16ed0 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
16ee0 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
16ef0 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
16f00 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
16f10 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
16f20 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
16f30 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
16f40 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
16f50 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
16f60 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
16f70 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
16f80 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16f90 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
16fa0 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
16fb0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
16fc0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
16fd0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
16fe0 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g==0 );.  PAGERT
16ff0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
17000 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
17010 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
17020 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
17030 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
17040 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
17050 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
17060 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
17070 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
17080 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
17090 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
170a0 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
170b0 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
170c0 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
170d0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
170e0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
170f0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
17100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
17110 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
17120 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
17130 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
17140 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
17150 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
17160 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
17170 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17180 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
17190 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
171a0 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
171b0 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
171c0 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
171d0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
171e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
171f0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
17200 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
17210 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
17220 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
17230 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
17240 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
17250 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
17260 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
17270 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
17280 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61  (u8 *)aData, pPa
17290 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
172a0 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
172b0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
172c0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
172d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
172e0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
172f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17300 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
17310 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
17320 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
17330 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
17340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
17350 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
17360 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
17370 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
17380 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
17390 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
173a0 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
173b0 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
173c0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
173d0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
173e0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
173f0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
17400 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
17410 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
17420 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
17430 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
17440 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
17450 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
17460 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
17470 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
17480 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
17490 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
174a0 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
174b0 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
174c0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
174d0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
174e0 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
174f0 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
17500 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
17510 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
17520 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
17530 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
17540 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
17550 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
17560 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
17570 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
17580 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
17590 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
175a0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
175b0 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
175c0 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
175d0 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
175e0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
175f0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
17600 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
17610 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
17620 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
17630 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
17640 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
17650 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
17660 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
17670 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
17680 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
17690 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
176a0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
176b0 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
176c0 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
176d0 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
176e0 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
176f0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
17700 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
17710 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
17720 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
17730 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
17740 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
17750 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17760 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
17770 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
17780 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
17790 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
177a0 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)==0 );.    pPa
177b0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
177c0 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  |= SPILLFLAG_ROL
177d0 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  LBACK;.    rc = 
177e0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
177f0 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17800 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17810 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
17820 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
17830 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17840 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )!=0 );.    pPag
17850 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
17860 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  = ~SPILLFLAG_ROL
17870 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72  LBACK;.    if( r
17880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
17890 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
178a0 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
178b0 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
178c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
178d0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
178e0 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
178f0 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
17900 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
17910 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
17920 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
17930 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
17940 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
17950 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
17960 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
17970 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
17980 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
17990 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
179a0 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
179b0 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
179c0 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
179d0 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
179e0 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
179f0 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
17a00 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
17a10 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
17a20 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
17a30 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
17a40 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  ta;.    pData = 
17a50 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
17a60 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75  memcpy(pData, (u
17a70 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
17a80 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17a90 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
17aa0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  er(pPg);.    if(
17ab0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28   isMainJrnl && (
17ac0 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70  !isSavepnt || *p
17ad0 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e  Offset<=pPager->
17ae0 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20  journalHdr) ){. 
17af0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
17b00 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
17b10 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72  page were just r
17b20 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65  estored from the
17b30 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20   main .      ** 
17b40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17b50 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d  en its content m
17b60 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77  ust be as they w
17b70 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20  ere when the .  
17b80 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
17b90 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  on was first ope
17ba0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
17bb0 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68  e we can mark th
17bc0 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
17bd0 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20  as clean, since 
17be0 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  there will be no
17bf0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69   need to write i
17c00 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20  t out to the.   
17c10 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
17c20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17c30 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65  * There is one e
17c40 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73  xception to this
17c50 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61   rule. If the pa
17c60 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  ge is being roll
17c70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
17c80 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61   as part of a sa
17c90 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74  vepoint (or stat
17ca0 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20  ement) rollback 
17cb0 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a  from an .      *
17cc0 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  * unsynced porti
17cd0 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  on of the main j
17ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
17cf0 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  n it is not safe
17d00 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72  .      ** to mar
17d10 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
17d20 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63  ean. This is bec
17d30 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65  ause marking the
17d40 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a   page as.      *
17d50 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65  * clean will cle
17d60 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
17d70 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e  D_SYNC flag. Sin
17d80 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  ce the page is. 
17d90 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
17da0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
17db0 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e  ile (recorded in
17dc0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
17dd0 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  l) and.      ** 
17de0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
17df0 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61  YNC flag is clea
17e00 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65  red, if the page
17e10 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20   is written to. 
17e20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
17e30 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
17e40 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ction, it will b
17e50 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
17e60 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  y but.      ** t
17e70 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17e80 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74  NC flag will not
17e90 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c   be set. It coul
17ea0 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c  d then potential
17eb0 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77  ly.      ** be w
17ec0 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20  ritten out into 
17ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17ee0 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75  e before its jou
17ef0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
17f00 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79  ** segment is sy
17f10 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68  nced. If a crash
17f20 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f   occurs during o
17f30 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  r following this
17f40 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  ,.      ** datab
17f50 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  ase corruption m
17f60 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20  ay ensue..      
17f70 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
17f80 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17f90 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73  ager) );.      s
17fa0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
17fb0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
17fc0 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
17fd0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a  pagehash(pPg);..
17fe0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
17ff0 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
18000 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
18010 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
18020 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
18030 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
18040 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
18050 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
18060 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
18070 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
18080 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
18090 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
180a0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
180b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
180c0 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
180d0 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
180e0 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
180f0 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
18100 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
18110 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
18120 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18130 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
18140 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
18160 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
18170 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
18180 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18190 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
181a0 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
181b0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
181c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
181d0 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
181e0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
181f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18200 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
18210 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
18220 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18230 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
18240 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
18250 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
18260 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
18270 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
18280 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
18290 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
182a0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
182b0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
182c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
182d0 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
182e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
182f0 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
18300 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
18310 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
18320 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
18330 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
18340 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
18350 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
18360 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
18370 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
18380 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
18390 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
183a0 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
183b0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
183c0 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
183d0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
183e0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
183f0 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
18400 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
18410 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
18420 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
18430 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
18440 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
18450 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
18460 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
18470 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
18480 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
18490 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
184a0 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
184b0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
184c0 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
184d0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
184e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
184f0 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
18500 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
18510 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
18520 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
18530 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
18540 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
18550 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
18560 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
18570 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
18580 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
18590 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
185a0 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
185b0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
185c0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
185d0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
185e0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
185f0 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
18600 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
18610 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
18620 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
18630 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
18640 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
18650 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
18660 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18670 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
18680 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
18690 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
186a0 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
186b0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
186c0 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
186d0 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
186e0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
186f0 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
18700 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
18710 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
18720 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
18730 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
18740 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18750 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
18760 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
18770 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
18780 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
18790 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
187a0 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
187b0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
187c0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
187d0 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
187e0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
187f0 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
18800 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18810 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
18820 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
18830 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
18840 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
18850 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
18860 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18870 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18880 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
18890 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
188a0 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
188b0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
188c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
188d0 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
188e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
188f0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18900 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18910 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18920 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
18930 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18940 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18960 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18970 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
18980 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
18990 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
189a0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
189b0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
189c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
189d0 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
189e0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
189f0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18a00 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
18a10 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
18a20 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
18a30 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
18a40 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
18a50 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
18a60 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
18a70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18a80 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18a90 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
18aa0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
18ab0 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
18ac0 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
18ad0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
18ae0 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
18af0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
18b00 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
18b10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18b20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
18b30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18b40 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
18b50 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
18b60 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
18b70 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
18b80 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
18b90 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
18ba0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
18bb0 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
18bc0 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
18bd0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18be0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
18bf0 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
18c00 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
18c10 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
18c20 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
18c30 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
18c40 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
18c50 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
18c60 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
18c70 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
18c80 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
18c90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18ca0 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
18cb0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
18cc0 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
18cd0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
18ce0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
18cf0 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
18d00 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
18d10 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
18d20 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
18d30 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
18d40 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18d50 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
18d60 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
18d70 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
18d80 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
18d90 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
18da0 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
18db0 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
18dc0 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
18dd0 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
18de0 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
18df0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
18e00 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
18e10 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
18e20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
18e30 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
18e40 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
18e50 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
18e60 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
18e70 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
18e80 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
18e90 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
18ea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18eb0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18ec0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
18ed0 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
18ee0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
18ef0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
18f00 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69  sqlite3Malloc((i
18f10 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
18f20 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
18f30 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
18f40 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
18f50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18f60 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  MEM;.    goto de
18f70 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
18f80 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
18f90 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
18fa0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
18fb0 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
18fc0 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
18fd0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
18fe0 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
18ff0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
19000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19010 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19020 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
19030 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
19040 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
19050 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
19060 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
19070 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
19080 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
19090 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
190a0 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
190b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
190c0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
190d0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
190e0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
190f0 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
19100 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19110 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19120 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
19130 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
19140 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
19150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
19160 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
19170 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
19180 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
19190 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
191a0 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
191b0 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
191c0 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
191d0 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
191e0 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
191f0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19200 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
19210 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
19220 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
19230 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19240 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
19250 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
19260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19270 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
19280 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
19290 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
192a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
192b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
192c0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
192d0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
192e0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
192f0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
19300 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
19310 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
19320 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
19330 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
19340 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19360 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19370 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
19380 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
19390 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
193a0 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
193b0 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
193c0 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
193d0 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
193e0 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
193f0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
19400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
19410 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19420 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19430 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
19440 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
19450 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
19460 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
19470 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19480 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
19490 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
194a0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
194b0 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
194c0 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
194d0 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
194e0 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
194f0 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
19500 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
19510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
19520 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
19530 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
19540 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
19550 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19560 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
19570 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
19580 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
19590 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
195a0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
195b0 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
195c0 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
195d0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
195e0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
195f0 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
19600 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
19610 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
19620 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
19630 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
19640 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
19650 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
19660 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
19670 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
19680 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
19690 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
196a0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
196b0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
196c0 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
196d0 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
196e0 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
196f0 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
19700 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
19710 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
19720 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
19730 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
19740 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
19750 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
19760 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
19770 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
19780 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
19790 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
197a0 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
197b0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
197c0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
197d0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
197e0 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
197f0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
19800 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
19810 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
19820 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
19830 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
19840 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
19850 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
19860 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
19870 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
19880 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
19890 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
198a0 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
198b0 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
198c0 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
198d0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
198e0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
198f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
19900 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
19910 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
19920 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
19930 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
19940 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
19950 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
19960 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19970 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
19980 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
19990 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
199a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
199b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
199c0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
199d0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
199e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
199f0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
19a00 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
19a10 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
19a20 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
19a30 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
19a40 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
19a50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
19a60 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
19a70 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
19a80 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
19a90 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
19aa0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
19ab0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19ac0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19ad0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
19ae0 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
19af0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
19b00 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
19b10 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
19b20 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
19b30 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
19b40 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
19b50 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
19b60 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
19b70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19b80 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
19b90 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
19ba0 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
19bb0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19bd0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
19be0 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
19bf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19c00 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50  (currentSize+szP
19c10 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b  age)<=newSize ){
19c20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
19c30 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
19c40 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
19c50 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
19c60 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
19c70 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
19c80 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20  Size-szPage) == 
19c90 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
19ca0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19cb0 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
19cc0 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) >  currentSize
19cd0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
19ce0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
19cf0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70  pPager->fd, pTmp
19d00 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a  , szPage, newSiz
19d10 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  e-szPage);.     
19d20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
19d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19d40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
19d50 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
19d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19d70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19d90 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72   a sanitized ver
19da0 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74  sion of the sect
19db0 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69  or-size of OS fi
19dc0 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a  le pFile. The.**
19dd0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
19de0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
19df0 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e  ie between 32 an
19e00 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  d MAX_SECTOR_SIZ
19e10 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
19e20 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  3SectorSize(sqli
19e30 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
19e40 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73  {.  int iRet = s
19e50 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
19e60 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ze(pFile);.  if(
19e70 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20   iRet<32 ){.    
19e80 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65  iRet = 512;.  }e
19e90 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58  lse if( iRet>MAX
19ea0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
19eb0 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
19ec0 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
19ed0 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d   );.    iRet = M
19ee0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
19ef0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
19f00 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
19f10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
19f20 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
19f30 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  e variable for t
19f40 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65  he given.** page
19f50 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76  r based on the v
19f60 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
19f70 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
19f80 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
19f90 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
19fa0 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72  file. The sector
19fb0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73   size will be us
19fc0 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64  ed used .** to d
19fd0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
19fe0 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20  e and alignment 
19ff0 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
1a000 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72  r and .** master
1a010 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1a020 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64  s within created
1a030 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
1a040 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
1a050 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66  ary files the ef
1a060 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a070 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31  ize is always 51
1a080 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  2 bytes..**.** O
1a090 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f  therwise, for no
1a0a0 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n-temporary file
1a0b0 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  s, the effective
1a0c0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a   sector size is.
1a0d0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  ** the value ret
1a0e0 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
1a0f0 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f  ctorSize() metho
1a100 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  d rounded up to 
1a110 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  32 if.** it is l
1a120 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20  ess than 32, or 
1a130 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
1a140 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1a150 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
1a160 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
1a170 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20  TOR_SIZE..**.** 
1a180 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  If the file has 
1a190 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
1a1a0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a1b0 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74  RITE property, t
1a1c0 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65  hen set.** the e
1a1d0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a1e0 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  size to its mini
1a1f0 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e  mum value (512).
1a200 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
1a210 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74  .** pPager->sect
1a220 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66  orSize is to def
1a230 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72  ine the "blast r
1a240 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20  adius" of bytes 
1a250 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1a260 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20  ange if a crash 
1a270 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69  occurs while wri
1a280 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65  ting to a single
1a290 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74   byte in.** that
1a2a0 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74   range.  But wit
1a2b0 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  h POWERSAFE_OVER
1a2c0 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74  WRITE, the blast
1a2d0 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a   radius is zero.
1a2e0 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74  ** (that is what
1a2f0 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1a300 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20  RITE means), so 
1a310 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  we minimize the 
1a320 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20  sector.** size. 
1a330 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
1a340 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20  ompatibility of 
1a350 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1a360 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1a370 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72  ,.** we cannot r
1a380 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1a390 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a3a0 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74  below 512..*/.st
1a3b0 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
1a3c0 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
1a3d0 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
1a3e0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1a3f0 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1a400 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
1a410 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
1a420 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  ile.   || (sqlit
1a430 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1a440 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1a450 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20  ->fd) & .       
1a460 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1a470 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1a480 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b  ERWRITE)!=0.  ){
1a490 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
1a4a0 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
1a4b0 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
1a4c0 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
1a4d0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
1a4e0 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
1a4f0 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
1a500 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
1a510 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1a520 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
1a530 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70  gfault. */.    p
1a540 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1a550 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  e = 512;.  }else
1a560 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
1a570 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
1a580 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  e3SectorSize(pPa
1a590 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a  ger->fd);.  }.}.
1a5a0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1a5b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1a5c0 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
1a5d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1a5e0 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
1a5f0 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
1a600 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
1a610 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
1a620 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
1a630 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
1a640 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
1a650 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
1a660 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
1a670 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
1a680 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
1a690 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a6a0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a6b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
1a6c0 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
1a6d0 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
1a6e0 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
1a6f0 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1a700 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
1a710 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1a720 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
1a730 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
1a740 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
1a750 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
1a760 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a770 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
1a780 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
1a790 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
1a7a0 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
1a7b0 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
1a7c0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1a7d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1a7e0 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
1a7f0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
1a800 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
1a810 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
1a820 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
1a830 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1a840 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
1a850 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
1a860 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
1a870 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1a880 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
1a890 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1a8a0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1a8b0 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73  ch is the page s
1a8c0 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65  ize..**  (7)  ze
1a8d0 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74  ro padding out t
1a8e0 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
1a8f0 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20  r size..**  (8) 
1a900 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
1a910 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
1a920 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
1a930 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1a940 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
1a950 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
1a960 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1a970 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
1a980 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1a990 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
1a9a0 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
1a9b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1a9c0 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
1a9d0 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20  e first 7 items 
1a9e0 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
1a9f0 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
1aa00 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
1aa10 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74  ce of the 8th it
1aa20 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
1aa30 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
1aa40 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
1aa50 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
1aa60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
1aa70 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
1aa80 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
1aa90 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
1aaa0 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
1aab0 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
1aac0 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
1aad0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1aae0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
1aaf0 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
1ab00 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
1ab10 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
1ab20 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
1ab30 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
1ab40 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
1ab50 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
1ab60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ab70 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
1ab80 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
1ab90 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
1aba0 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
1abb0 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
1abc0 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
1abd0 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
1abe0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
1abf0 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
1ac00 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
1ac10 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
1ac20 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
1ac30 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
1ac40 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1ac50 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1ac60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
1ac70 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1ac80 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
1ac90 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
1aca0 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
1acb0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1acc0 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
1acd0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
1ace0 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
1acf0 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
1ad00 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
1ad10 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
1ad20 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
1ad30 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
1ad40 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
1ad50 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
1ad60 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
1ad70 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
1ad80 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
1ad90 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
1ada0 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
1adb0 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
1adc0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
1add0 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
1ade0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
1adf0 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
1ae00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1ae10 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
1ae20 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
1ae30 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
1ae40 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
1ae50 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
1ae60 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1ae70 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
1ae80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
1ae90 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
1aea0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1aeb0 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
1aec0 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
1aed0 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
1aee0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
1aef0 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
1af00 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
1af10 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
1af20 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
1af30 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
1af40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1af50 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
1af60 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74  he isHot paramet
1af70 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  er indicates tha
1af80 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
1af90 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f  to rollback a jo
1afa0 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69  urnal.** that mi
1afb0 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75  ght be a hot jou
1afc0 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f  rnal.  Or, it co
1afd0 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20  uld be that the 
1afe0 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70  journal is .** p
1aff0 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65  reserved because
1b000 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   of JOURNALMODE_
1b010 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e  PERSIST or JOURN
1b020 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e  ALMODE_TRUNCATE.
1b030 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1b040 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74  al really is hot
1b050 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  , reset the page
1b060 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f  r cache prior ro
1b070 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e  lling.** back an
1b080 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74  y content.  If t
1b090 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65  he journal is me
1b0a0 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c  rely persistent,
1b0b0 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20   no reset is.** 
1b0c0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
1b0d0 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
1b0e0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1b0f0 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
1b100 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1b110 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
1b120 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b140 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
1b150 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
1b160 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
1b170 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b180 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1b190 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
1b1a0 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
1b1b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b1c0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1b1d0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1b1e0 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
1b1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b200 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
1b210 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
1b220 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b240 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
1b250 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
1b260 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
1b270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1b280 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b290 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1b2a0 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
1b2b0 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
1b2c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
1b2d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b2e0 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
1b2f0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20  needPagerReset; 
1b300 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1b310 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72  reset page prior
1b320 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72   to first page r
1b330 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
1b340 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20   nPlayback = 0; 
1b350 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1b360 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72  umber of pages r
1b370 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75  estored from jou
1b380 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  rnal */..  /* Fi
1b390 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1b3a0 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1b3b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1b3c0 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1b3d0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1b3e0 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1b3f0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1b400 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1b410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1b420 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1b430 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1b440 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b450 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1b460 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1b470 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1b480 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1b490 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1b4a0 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1b4b0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1b4c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1b4d0 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1b4e0 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1b4f0 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1b500 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1b510 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1b520 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1b530 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1b540 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1b550 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1b560 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1b570 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1b580 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1b590 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1b5a0 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1b5b0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1b5c0 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1b5d0 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1b5e0 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1b5f0 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1b600 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1b610 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1b620 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1b630 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74  x.c,.  **  mxPat
1b640 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1b650 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1b660 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1b670 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1b680 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1b690 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1b6a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1b6b0 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1b6c0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1b6d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1b6e0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1b6f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1b700 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1b710 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1b720 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1b730 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1b740 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1b750 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1b760 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1b770 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1b780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b790 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1b7a0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1b7b0 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1b7c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1b7d0 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1b7e0 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1b7f0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1b800 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1b810 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1b820 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1b830 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1b840 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1b850 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1b860 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1b870 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1b880 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1b890 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1b8a0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1b8b0 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1b8c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b8d0 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1b8e0 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1b8f0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1b900 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1b910 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1b920 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1b930 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1b940 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1b950 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1b960 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
1b970 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
1b980 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
1b990 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
1b9a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1b9b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
1b9c0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1b9d0 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
1b9e0 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
1b9f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ba00 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
1ba10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1ba20 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
1ba30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ba40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1ba50 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1ba60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1ba70 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
1ba80 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
1ba90 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
1baa0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
1bab0 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
1bac0 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
1bad0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1bae0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1baf0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
1bb00 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
1bb10 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
1bb20 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
1bb30 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
1bb40 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
1bb50 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
1bb60 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
1bb70 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1bb80 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
1bb90 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
1bba0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1bbb0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1bbc0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bbd0 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
1bbe0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
1bbf0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1bc00 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
1bc10 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1bc20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1bc30 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
1bc40 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
1bc50 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
1bc60 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
1bc70 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
1bc80 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1bc90 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
1bca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
1bcb0 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
1bcc0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
1bcd0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1bce0 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
1bcf0 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
1bd00 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
1bd10 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
1bd20 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
1bd30 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
1bd40 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
1bd50 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
1bd60 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1bd70 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
1bd80 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
1bd90 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
1bda0 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
1bdb0 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
1bdc0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1bdd0 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
1bde0 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
1bdf0 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
1be00 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
1be10 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
1be20 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
1be30 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1be40 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
1be50 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
1be60 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
1be70 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
1be80 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
1be90 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1bea0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1beb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1bec0 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
1bed0 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
1bee0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1bef0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
1bf00 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
1bf10 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
1bf20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
1bf30 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
1bf40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1bf50 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1bf60 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
1bf70 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
1bf80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1bf90 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1bfa0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1bfb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1bfc0 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
1bfd0 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
1bfe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1bff0 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
1c000 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1c010 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1c020 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
1c030 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
1c040 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
1c050 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
1c060 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
1c070 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
1c080 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
1c090 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c0a0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1c0b0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c0c0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1c0d0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1c0e0 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
1c0f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c110 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c120 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
1c130 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1c140 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
1c150 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
1c160 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
1c170 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1c180 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
1c190 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
1c1a0 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
1c1b0 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
1c1c0 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
1c1d0 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
1c1e0 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
1c1f0 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
1c200 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1c210 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
1c220 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
1c230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1c240 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1c250 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1c260 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
1c270 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
1c280 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c2a0 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20    nPlayback++;. 
1c2b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c2c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c2d0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1c2e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1c2f0 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
1c300 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c310 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1c320 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1c330 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1c340 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c350 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
1c360 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c   been truncated,
1c370 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61   simply stop rea
1c380 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20  ding and.       
1c390 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1c3a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68   the journal. Th
1c3b0 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20  is might happen 
1c3c0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  if the journal w
1c3d0 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  as.          ** 
1c3e0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77  not completely w
1c3f0 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65  ritten and synce
1c400 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61  d prior to a cra
1c410 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20  sh.  In that.   
1c420 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20         ** case, 
1c430 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
1c440 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62  uld have never b
1c450 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74  een written in t
1c460 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
1c470 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69  first place so i
1c480 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c  t is OK to simpl
1c490 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f  y abandon the ro
1c4a0 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  llback. */.     
1c4b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c4c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1c4d0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c4e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c4f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c500 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
1c510 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74  o rollback, quit
1c520 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
1c530 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1c540 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77  ** code.  This w
1c550 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61  ill cause the pa
1c560 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
1c570 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20   error state.   
1c580 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61         ** so tha
1c590 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72  t no further har
1c5a0 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20  m will be done. 
1c5b0 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
1c5c0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
1c5d0 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
1c5e0 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c  long will be abl
1c5f0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e to rollback th
1c600 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
1c610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c620 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c630 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
1c640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c650 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
1c660 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
1c670 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
1c680 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20  .  /* Following 
1c690 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  a rollback, the 
1c6a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1c6b0 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20  ould be back in 
1c6c0 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
1c6d0 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f  * state prior to
1c6e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1c6f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73  e transaction, s
1c700 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a  o invoke the.  *
1c710 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  * SQLITE_FCNTL_D
1c720 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65  B_UNCHANGED file
1c730 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  -control method 
1c740 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20  to disable the. 
1c750 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68   ** assertion th
1c760 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1c770 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d  on counter was m
1c780 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69  odified..  */.#i
1c790 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1c7a0 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  G.  if( pPager->
1c7b0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1c7c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
1c7d0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
1c7e0 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
1c7f0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1c800 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  D,0);.  }.#endif
1c810 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1c820 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
1c830 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
1c840 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
1c850 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
1c860 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
1c870 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
1c880 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
1c890 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
1c8a0 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
1c8b0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
1c8c0 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
1c8d0 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
1c8e0 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
1c8f0 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
1c900 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
1c910 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
1c920 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
1c930 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
1c940 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
1c950 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
1c960 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
1c970 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
1c980 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
1c990 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1c9a0 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
1c9b0 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
1c9c0 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
1c9d0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
1c9e0 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
1c9f0 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
1ca00 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
1ca10 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
1ca20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
1ca30 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
1ca40 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
1ca50 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
1ca60 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
1ca70 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
1ca80 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
1ca90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1caa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
1cab0 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1cac0 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
1cad0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1cae0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1caf0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1cb00 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1cb10 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
1cb20 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cb30 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cb40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
1cb50 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
1cb60 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1cb70 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
1cb80 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1cb90 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72  OPEN).  ){.    r
1cba0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cbb0 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b  Sync(pPager, 0);
1cbc0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1cbd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cbe0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
1cbf0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1cc00 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27  r, zMaster[0]!='
1cc10 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  \0', 0);.    tes
1cc20 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1cc30 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1cc40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cc50 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
1cc60 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
1cc70 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
1cc80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
1cc90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1cca0 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
1ccb0 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
1ccc0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1ccd0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
1cce0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
1ccf0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
1cd00 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
1cd10 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1cd20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1cd30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1cd40 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26   }.  if( isHot &
1cd50 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20  & nPlayback ){. 
1cd60 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
1cd70 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
1cd80 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22  OVER_ROLLBACK, "
1cd90 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67  recovered %d pag
1cda0 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20  es from %s",.   
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c               nPl
1cdc0 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e  ayback, pPager->
1cdd0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a  zJournal);.  }..
1cde0 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
1cdf0 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1ce00 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
1ce10 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
1ce20 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
1ce30 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
1ce40 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1ce50 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
1ce60 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
1ce70 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
1ce80 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
1ce90 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
1cea0 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
1ceb0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
1cec0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1ced0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1cee0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
1cef0 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
1cf00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1cf10 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
1cf20 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
1cf30 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
1cf40 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
1cf50 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1cf60 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
1cf70 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1cf80 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1cf90 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
1cfa0 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
1cfb0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
1cfc0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
1cfd0 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
1cfe0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
1cff0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1d000 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
1d010 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1d020 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
1d030 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1d040 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
1d050 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
1d060 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d070 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1d080 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
1d090 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20  , u32 iFrame){. 
1d0a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d0b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1d0c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1d0d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1d0e0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1d0f0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1d100 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1d110 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1d120 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1d130 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1d140 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d150 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
1d160 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d170 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
1d180 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
1d190 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1d1a0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1d1b0 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d  R_READER && !MEM
1d1c0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1d1d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1d1e0 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  d) );..#ifndef S
1d1f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1d200 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1d210 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
1d220 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
1d230 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
1d240 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
1d250 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46   sqlite3WalReadF
1d260 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1d270 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c  l, iFrame, pgsz,
1d280 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1d290 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1d2a0 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1d2b0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1d2c0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1d2d0 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1d2e0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1d2f0 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1d300 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1d310 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d320 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1d330 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1d340 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d350 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d360 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1d370 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1d380 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1d390 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1d3a0 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1d3b0 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1d3c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1d3d0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1d3e0 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1d3f0 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1d400 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1d410 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1d420 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1d430 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1d440 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1d450 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1d460 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1d470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1d480 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1d490 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1d4a0 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1d4b0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1d4c0 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1d4d0 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1d4e0 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1d4f0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d500 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1d510 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1d520 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1d530 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1d540 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1d550 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1d560 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1d570 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1d580 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1d590 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1d5a0 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1d5b0 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1d5c0 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1d5d0 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
1d5e0 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
1d5f0 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
1d600 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
1d610 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
1d620 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
1d630 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
1d640 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
1d650 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
1d660 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1d670 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1d680 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
1d690 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
1d6a0 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
1d6b0 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
1d6c0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1d6d0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
1d6e0 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
1d6f0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1d700 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
1d710 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
1d720 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
1d730 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1d740 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
1d750 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1d760 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
1d770 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1d780 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
1d790 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
1d7a0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1d7b0 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
1d7c0 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
1d7d0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1d7e0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1d7f0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1d800 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
1d810 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1d820 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1d830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1d840 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1d850 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d860 20 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61   at offsets 24 a
1d870 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20  nd 92 in.** the 
1d880 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73  header and the s
1d890 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  qlite version nu
1d8a0 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39  mber at offset 9
1d8b0 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  6..**.** This is
1d8c0 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   an unconditiona
1d8d0 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61  l update.  See a
1d8e0 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e  lso the pager_in
1d8f0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1d900 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68  ().** routine wh
1d910 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73  ich only updates
1d920 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d930 74 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74  ter if the updat
1d940 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  e is actually.**
1d950 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65   needed, as dete
1d960 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50  rmined by the pP
1d970 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1d980 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69  tDone state vari
1d990 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1d9a0 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65  void pager_write
1d9b0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1d9c0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33  gHdr *pPg){.  u3
1d9d0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1d9e0 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1d9f0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1da00 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1da10 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1da20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
1da30 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
1da40 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
1da50 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  Pg->pPager->dbFi
1da60 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74  leVers)+1;.  put
1da70 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1da80 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  Pg->pData)+24, c
1da90 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1daa0 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65  .  /* Also store
1dab0 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
1dac0 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79  ion number in by
1dad0 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69  tes 96..99 and i
1dae0 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e  n.  ** bytes 92.
1daf0 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68  .95 store the ch
1db00 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72  ange counter for
1db10 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69   which the versi
1db20 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69  on number.  ** i
1db30 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75  s valid. */.  pu
1db40 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1db50 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20  pPg->pData)+92, 
1db60 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1db70 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1db80 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1db90 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
1dba0 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a  ION_NUMBER);.}..
1dbb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1dbc0 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
1dbd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1dbe0 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20  nvoked once for 
1dbf0 65 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68  each page that h
1dc00 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1dc10 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
1dc20 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68   the log file wh
1dc30 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  en a WAL transac
1dc40 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1dc50 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ack..** Paramete
1dc60 72 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67  r iPg is the pag
1dc70 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64  e number of said
1dc80 20 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20   page. The pCtx 
1dc90 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20  argument .** is 
1dca0 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74  actually a point
1dcb0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
1dcc0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
1dcd0 20 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20   If page iPg is 
1dce0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63  present in the c
1dcf0 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f  ache, and has no
1dd00 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1dd10 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69  erences,.** it i
1dd20 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68  s discarded. Oth
1dd30 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
1dd40 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
1dd50 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
1dd60 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20  references, the 
1dd70 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1dd80 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68  reloaded from th
1dd90 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
1dda0 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  he.** attempt to
1ddb0 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20   reload content 
1ddc0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1ddd0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  e is required an
1dde0 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74  d fails, .** ret
1ddf0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
1de00 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
1de10 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
1de20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1de30 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1de40 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f  void *pCtx, Pgno
1de50 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20   iPg){.  int rc 
1de60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1de70 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1de80 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20  Pager *)pCtx;.  
1de90 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
1dea0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1deb0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1dec0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
1ded0 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
1dee0 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67   iPg);.  if( pPg
1def0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1df00 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66  te3PcachePageRef
1df10 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b  count(pPg)==1 ){
1df20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
1df30 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
1df40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df50 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a  u32 iFrame = 0;.
1df60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1df70 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
1df80 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67  Pager->pWal, pPg
1df90 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  ->pgno, &iFrame)
1dfa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1dfb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dfc0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
1dfd0 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65  Page(pPg, iFrame
1dfe0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1e010 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
1e020 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
1e030 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1e040 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
1e050 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1e060 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
1e070 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1e080 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
1e090 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
1e0a0 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
1e0b0 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
1e0c0 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
1e0d0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1e0e0 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
1e0f0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
1e100 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
1e110 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
1e120 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
1e130 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
1e140 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
1e150 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
1e160 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
1e170 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
1e180 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
1e190 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
1e1a0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1e1b0 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
1e1c0 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
1e1d0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
1e1e0 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
1e1f0 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
1e200 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
1e210 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
1e220 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
1e230 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
1e240 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
1e250 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
1e260 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1e270 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1e280 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e290 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
1e2a0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
1e2b0 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
1e2c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e2d0 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
1e2e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1e2f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e310 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
1e320 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
1e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e340 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
1e350 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
1e360 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
1e370 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
1e380 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
1e390 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1e3a0 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
1e3b0 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
1e3c0 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
1e3d0 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
1e3e0 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
1e3f0 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
1e400 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
1e410 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
1e420 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
1e430 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
1e440 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
1e450 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
1e460 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e470 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
1e480 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1e490 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1e4a0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1e4b0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
1e4c0 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
1e4d0 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
1e4e0 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
1e4f0 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
1e500 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e510 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e520 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
1e530 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
1e540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e550 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
1e560 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1e570 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1e580 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
1e590 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
1e5a0 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
1e5b0 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
1e5c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e5d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e5e0 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
1e5f0 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
1e600 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
1e610 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
1e620 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1e630 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
1e640 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
1e650 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
1e660 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
1e670 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
1e680 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
1e690 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1e6a0 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
1e6b0 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
1e6c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20  .**.** The list 
1e6d0 6f 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20  of pages passed 
1e6e0 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
1e6f0 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74  e is always sort
1e700 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ed by page numbe
1e710 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20  r..** Hence, if 
1e720 70 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61  page 1 appears a
1e730 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  nywhere on the l
1e740 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ist, it will be 
1e750 74 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a  the first page..
1e760 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
1e770 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
1e780 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1e7b0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1e7c0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1e7d0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1e7e0 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
1e7f0 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
1e800 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1e810 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e820 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
1e830 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1e840 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1e850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e860 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1e870 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20   commit */.){.  
1e880 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1e8b0 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20  /.  int nList;  
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e8e0 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20   pages in pList 
1e8f0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1e900 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1e910 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1e920 48 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67  HECK_PAGES).  Pg
1e930 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e950 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1e960 72 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69  r pages */.#endi
1e970 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
1e980 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61  ger->pWal );.  a
1e990 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1e9a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e9b0 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
1e9c0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69  that the page li
1e9d0 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69  st is in accendi
1e9e0 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f  ng order */.  fo
1e9f0 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20  r(p=pList; p && 
1ea00 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e  p->pDirty; p=p->
1ea10 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73  pDirty){.    ass
1ea20 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70  ert( p->pgno < p
1ea30 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29  ->pDirty->pgno )
1ea40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1ea50 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70  assert( pList->p
1ea60 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f  Dirty==0 || isCo
1ea70 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73  mmit );.  if( is
1ea80 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  Commit ){.    /*
1ea90 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61   If a WAL transa
1eaa0 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
1eab0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20  ommitted, there 
1eac0 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77  is no point in w
1ead0 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  riting.    ** an
1eae0 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  y pages with pag
1eaf0 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
1eb00 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65  r than nTruncate
1eb10 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69   into the WAL fi
1eb20 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20  le..    ** They 
1eb30 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65  will never be re
1eb40 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  ad by any client
1eb50 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d  . So remove them
1eb60 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79   from the pDirty
1eb70 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72  .    ** list her
1eb80 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20  e. */.    PgHdr 
1eb90 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a  *p;.    PgHdr **
1eba0 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b  ppNext = &pList;
1ebb0 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a  .    nList = 0;.
1ebc0 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1ebd0 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d   (*ppNext = p)!=
1ebe0 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  0; p=p->pDirty){
1ebf0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
1ec00 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b  no<=nTruncate ){
1ec10 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20  .        ppNext 
1ec20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = &p->pDirty;.  
1ec30 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20        nList++;. 
1ec40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ec50 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1ec60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1ec70 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  List = 1;.  }.  
1ec80 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
1ec90 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20  GER_STAT_WRITE] 
1eca0 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28  += nList;..  if(
1ecb0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
1ecc0 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
1ecd0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
1ece0 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  t);.  rc = sqlit
1ecf0 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  e3WalFrames(pPag
1ed00 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20  er->pWal, .     
1ed10 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ed20 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63  e, pList, nTrunc
1ed30 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70  ate, isCommit, p
1ed40 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
1ed50 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
1ed60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ed70 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
1ed80 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1ed90 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1eda0 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1edb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1edc0 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1edd0 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1ede0 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1edf0 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1ee00 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1ee10 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1ee20 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1ee30 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1ee40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1ee50 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1ee60 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ee70 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1ee80 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1ee90 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1eea0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1eeb0 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1eec0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1eed0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1eee0 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1eef0 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1ef00 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1ef10 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1ef20 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1ef30 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1ef40 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1ef50 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1ef60 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1ef70 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1ef80 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1ef90 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1efa0 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1efb0 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1efc0 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1efd0 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1efe0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1eff0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1f000 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1f010 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1f020 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f040 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1f050 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f070 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1f080 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1f090 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1f0a0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1f0b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f0c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1f0d0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1f0e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f0f0 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1f100 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1f110 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1f120 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1f130 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1f140 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1f150 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1f160 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1f170 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1f180 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1f190 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1f1a0 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1f1b0 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1f1c0 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1f1d0 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1f1e0 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1f1f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1f200 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1f210 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1f220 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f230 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1f240 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1f250 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1f260 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1f270 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1f280 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1f290 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1f2a0 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
1f2b0 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
1f2c0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
1f2d0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
1f2e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1f2f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1f300 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f310 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1f320 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
1f330 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
1f340 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
1f350 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
1f360 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
1f370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f380 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
1f390 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
1f3a0 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
1f3b0 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
1f3c0 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
1f3d0 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
1f3e0 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
1f3f0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1f400 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f410 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
1f420 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
1f430 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
1f440 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
1f450 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
1f460 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1f470 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
1f480 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1f490 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
1f4a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f4b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1f4c0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1f4d0 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1f4e0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f500 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1f510 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1f520 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
1f530 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
1f540 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
1f550 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
1f560 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
1f570 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
1f580 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
1f590 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
1f5a0 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
1f5b0 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
1f5c0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1f5d0 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
1f5e0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1f5f0 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
1f600 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1f610 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
1f620 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
1f630 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
1f640 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
1f650 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
1f660 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
1f670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1f680 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1f690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1f6a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1f6b0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50  RED_LOCK );.  nP
1f6c0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
1f6d0 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
1f6e0 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
1f6f0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f700 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62   was 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 2c 0a 20 20 2a 2a  sub-system,.  **
1f730 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61   determine it ba
1f740 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20  sed on the size 
1f750 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f760 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a  file. If the siz
1f770 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61  e.  ** of the da
1f780 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1f790 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
1f7a0 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
1f7b0 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f  ge-size,.  ** ro
1f7c0 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  und down to the 
1f7d0 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45 78  nearest page. Ex
1f7e0 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c  cept, any file l
1f7f0 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a  arger than 0.  *
1f800 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  * bytes in size 
1f810 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
1f820 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
1f830 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f  t one page..  */
1f840 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
1f850 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
1f860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f870 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1f880 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
1f890 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1f8a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1f8b0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1f8c0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1f8d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1f8e0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  >fd) ){.      in
1f8f0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
1f900 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1f910 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  >fd, &n);.      
1f920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f930 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1f940 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f950 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
1f960 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67  = (Pgno)((n+pPag
1f970 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20  er->pageSize-1) 
1f980 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
1f990 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
1f9a0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
1f9b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f9c0 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
1f9d0 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
1f9e0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1f9f0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1fa00 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1fa10 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1fa20 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1fa30 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1fa40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1fa50 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1fa60 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1fa70 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1fa80 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
1fa90 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1faa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fab0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
1fac0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1fad0 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
1fae0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
1faf0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1fb00 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
1fb10 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
1fb20 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
1fb30 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1fb40 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
1fb50 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
1fb60 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
1fb70 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
1fb80 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
1fb90 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
1fba0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
1fbb0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1fbc0 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
1fbd0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1fbe0 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
1fbf0 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
1fc00 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1fc10 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
1fc20 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
1fc30 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
1fc40 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1fc50 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
1fc60 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
1fc70 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
1fc80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1fc90 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
1fca0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
1fcb0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1fcc0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1fcd0 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
1fce0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1fcf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1fd00 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
1fd10 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
1fd20 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1fd30 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
1fd40 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
1fd50 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
1fd60 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
1fd70 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
1fd80 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
1fd90 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
1fda0 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
1fdb0 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
1fdc0 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
1fdd0 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
1fde0 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
1fdf0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
1fe00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1fe10 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
1fe20 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
1fe30 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1fe40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1fe50 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1fe60 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1fe70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1fe80 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1fe90 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  D_LOCK );..  if(
1fea0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1feb0 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
1fec0 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
1fed0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1fee0 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
1fef0 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ts */.    Pgno n
1ff00 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1ff10 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ff20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ff30 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20  file */..    rc 
1ff40 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
1ff50 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
1ff60 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1ff70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
1ff80 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1ff90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ffa0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
1ffb0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1ffc0 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Wal, 0);.      i
1ffd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1ffe0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
1fff0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
20000 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d  K;.      isWal =
20010 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
20020 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20030 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
20040 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66       pPager->pVf
20050 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
20060 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
20070 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20  XISTS, &isWal.  
20080 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
20090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
200a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
200b0 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  isWal ){.       
200c0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
200d0 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
200e0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
200f0 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e)==0 );.       
20100 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20110 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72  erOpenWal(pPager
20120 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
20130 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
20140 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
20150 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
20160 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
20170 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
20180 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
20190 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  ODE_DELETE;.    
201a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
201b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
201c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  dif../*.** Playb
201d0 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
201e0 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
201f0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
20200 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
20210 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
20220 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20230 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
20240 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
20250 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
20260 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
20270 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
20280 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
20290 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
202a0 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
202b0 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
202c0 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
202d0 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
202e0 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
202f0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
20300 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
20310 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
20320 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
20330 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
20340 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
20350 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
20360 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
20370 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
20380 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
20390 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
203a0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
203b0 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
203c0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
203d0 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
203e0 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
203f0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
20400 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
20410 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
20420 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
20430 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
20440 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
20450 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
20460 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
20470 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
20480 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
20490 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
204a0 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
204b0 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
204c0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
204d0 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
204e0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
204f0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
20500 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
20510 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
20520 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
20530 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
20540 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
20550 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20560 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
20570 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
20580 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
20590 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
205a0 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
205b0 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
205c0 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
205d0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
205e0 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
205f0 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
20600 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
20610 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
20620 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
20630 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
20640 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
20650 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
20660 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
20670 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
20680 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
20690 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
206a0 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
206b0 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
206c0 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
206d0 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
206e0 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
206f0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
20700 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
20710 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
20720 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
20730 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
20740 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
20750 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
20760 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
20770 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
20780 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
20790 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
207a0 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
207b0 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
207c0 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
207d0 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
207e0 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
207f0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
20800 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
20810 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
20820 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
20830 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
20840 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
20850 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
20860 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
20870 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
20880 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
20890 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
208a0 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
208b0 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
208c0 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
208d0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
208e0 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
208f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20900 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
20910 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
20920 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
20930 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
20940 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
20950 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
20960 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
20970 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
20980 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
20990 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
209a0 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
209b0 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
209c0 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
209d0 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
209e0 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
209f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
20a00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
20a10 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
20a20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20a30 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
20a40 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a  ITER_LOCKED );..
20a50 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
20a60 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
20a70 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
20a80 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
20a90 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
20aa0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
20ab0 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
20ac0 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
20ad0 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
20ae0 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
20af0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20b00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
20b10 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
20b20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
20b30 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
20b40 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
20b50 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
20b60 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
20b70 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
20b80 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
20b90 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
20ba0 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
20bb0 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
20bc0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
20bd0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
20be0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
20bf0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
20c00 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26  f( !pSavepoint &
20c10 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
20c20 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
20c30 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  urn pagerRollbac
20c40 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  kWal(pPager);.  
20c50 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  }..  /* Use pPag
20c60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
20c70 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
20c80 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
20c90 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
20ca0 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
20cb0 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
20cc0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
20cd0 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
20ce0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
20cf0 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
20d00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
20d10 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
20d20 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
20d30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
20d40 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
20d50 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
20d60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20d70 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
20d80 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20d90 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20  r)==0 || szJ==0 
20da0 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  );..  /* Begin b
20db0 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
20dc0 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
20dd0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
20de0 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
20df0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
20e00 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
20e10 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
20e20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
20e30 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
20e40 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
20e50 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20e60 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
20e70 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
20e80 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
20e90 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
20ea0 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
20eb0 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
20ec0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
20ed0 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
20ee0 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
20ef0 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
20f00 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
20f10 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
20f20 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
20f30 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
20f40 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
20f50 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
20f60 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
20f70 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
20f80 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
20f90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
20fa0 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
20fb0 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
20fc0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
20fd0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
20fe0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
20ff0 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
21000 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21010 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21020 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
21030 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
21040 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
21050 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21060 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65  ITE_DONE );.  }e
21070 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
21080 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
21090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69  .  }..  /* Conti
210a0 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  nue rolling back
210b0 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
210c0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
210d0 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
210e0 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  * the first jour
210f0 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20  nal header seen 
21100 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75  and continuing u
21110 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69  ntil the effecti
21120 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ve end.  ** of t
21130 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21140 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20  file.  Continue 
21150 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72  to skip out-of-r
21160 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20  ange pages and. 
21170 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64   ** continue add
21180 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64  ing pages rolled
21190 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a   back to pDone..
211a0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63    */.  while( rc
211b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
211c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
211d0 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  f<szJ ){.    u32
211e0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
211f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21200 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  */.    u32 nJRec
21210 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
21220 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
21230 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
21240 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
21250 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
21260 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c  (pPager, 0, szJ,
21270 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
21280 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
21290 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
212a0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
212b0 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75  The "pPager->jou
212c0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
212d0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
212e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
212f0 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20  ff".    ** test 
21300 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69  is related to ti
21310 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65  cket #2565.  See
21320 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
21330 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  in the.    ** pa
21340 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66  ger_playback() f
21350 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  unction for addi
21360 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
21370 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
21380 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
21390 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
213a0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
213b0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
213c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
213d0 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
213e0 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
213f0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
21400 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
21410 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
21420 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
21430 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
21440 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
21450 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21460 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
21470 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21480 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
21490 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
214a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
214b0 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
214c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
214d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
214e0 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
214f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21500 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
21510 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff>=szJ );.. 
21520 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
21530 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
21540 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
21550 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
21560 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
21570 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
21580 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
21590 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
215a0 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
215b0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
215c0 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
215d0 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
215e0 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
215f0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
21600 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
21610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21620 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
21630 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
21640 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d  (i64)pSavepoint-
21650 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >iSubRec*(4+pPag
21660 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
21670 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
21680 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21690 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
216a0 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64  3WalSavepointUnd
216b0 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
216c0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c  pSavepoint->aWal
216d0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
216e0 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
216f0 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
21700 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
21710 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
21720 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
21730 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28  ssert( offset==(
21740 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72  i64)ii*(4+pPager
21750 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20  ->pageSize) );. 
21760 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21770 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
21780 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65  e(pPager, &offse
21790 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b  t, pDone, 0, 1);
217a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
217b0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
217c0 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  NE );.  }..  sql
217d0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
217e0 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20  y(pDone);.  if( 
217f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21800 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
21810 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
21820 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
21830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
21840 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
21850 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
21860 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
21870 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
21880 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21890 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
218a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
218b0 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
218c0 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
218d0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
218e0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
218f0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49  *.** Invoke SQLI
21900 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
21910 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ZE based on the 
21920 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
21930 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74   szMmap..*/.stat
21940 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78  ic void pagerFix
21950 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a  Maplimit(Pager *
21960 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c  pPager){.#if SQL
21970 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
21980 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  E>0.  sqlite3_fi
21990 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
219a0 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  >fd;.  if( isOpe
219b0 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65  n(fd) && fd->pMe
219c0 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
219d0 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =3 ){.    sqlite
219e0 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20  3_int64 sz;.    
219f0 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d  sz = pPager->szM
21a00 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  map;.    pPager-
21a10 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a  >bUseFetch = (sz
21a20 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
21a30 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
21a40 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
21a50 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
21a60 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a  SIZE, &sz);.  }.
21a70 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
21a80 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
21a90 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d  um size of any m
21aa0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
21ab0 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
21ac0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  se file..*/.void
21ad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21ae0 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20  MmapLimit(Pager 
21af0 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
21b00 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
21b10 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70    pPager->szMmap
21b20 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67   = szMmap;.  pag
21b30 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
21b40 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
21b50 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  Free as much mem
21b60 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
21b70 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a  from the pager..
21b80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
21b90 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72  agerShrink(Pager
21ba0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
21bb0 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b  ite3PcacheShrink
21bc0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21bd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
21be0 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74  st settings of t
21bf0 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73  he pager to thos
21c00 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
21c10 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d  he pgFlags param
21c20 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
21c30 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61  "level" in pgFla
21c40 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
21c50 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73  RONOUS_MASK sets
21c60 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a   the robustness.
21c70 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
21c80 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
21c90 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f   to OS crashes o
21ca0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
21cb0 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20   by.** changing 
21cc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
21cd0 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
21ce0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73  ing the journals
21cf0 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  ..** There are t
21d00 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
21d10 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
21d20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
21d30 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
21d40 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
21d50 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
21d60 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
21d70 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
21d80 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
21d90 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
21da0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
21db0 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
21dc0 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
21dd0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21de0 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
21df0 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
21e00 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
21e10 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
21e20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
21e30 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
21e40 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
21e50 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
21e60 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
21e70 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
21e80 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
21e90 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
21ea0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
21eb0 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
21ec0 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
21ed0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
21ee0 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
21ef0 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
21f00 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
21f10 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
21f20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
21f30 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
21f40 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
21f50 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
21f60 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
21f70 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
21f80 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
21f90 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
21fa0 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
21fb0 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
21fc0 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
21fd0 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
21fe0 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
21ff0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
22000 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
22010 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
22020 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
22030 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
22040 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
22050 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
22060 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
22070 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
22080 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
22090 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
220a0 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
220b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
220c0 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
220d0 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
220e0 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
220f0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
22100 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f   The above is fo
22110 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  r a rollback-jou
22120 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rnal mode.  For 
22130 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f  WAL mode, OFF co
22140 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65  ntinues.** to me
22150 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73  an that no syncs
22160 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f   ever occur.  NO
22170 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  RMAL means that 
22180 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65  the WAL is synce
22190 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68  d.** prior to th
221a0 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b  e start of check
221b0 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74  point and that t
221c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
221d0 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74   is synced.** at
221e0 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
221f0 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  of the checkpoin
22200 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  t if the entire 
22210 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57  content of the W
22220 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65  AL.** was writte
22230 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
22240 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e  database.  But n
22250 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e  o sync operation
22260 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61  s occur for.** a
22270 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69  n ordinary commi
22280 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65  t in NORMAL mode
22290 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c   with WAL.  FULL
222a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
222b0 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  WAL.** file is s
222c0 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
222d0 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72  each commit oper
222e0 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69  ation, in additi
222f0 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e  on to the.** syn
22300 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  cs associated wi
22310 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a  th NORMAL..**.**
22320 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20   Do not confuse 
22330 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
22340 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e   with SQLITE_SYN
22350 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20  C_FULL.  The.** 
22360 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22370 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20   macro means to 
22380 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73  use the MacOSX-s
22390 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a  tyle full-fsync.
223a0 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46  ** using fcntl(F
223b0 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51  _FULLFSYNC).  SQ
223c0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
223d0 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a   means to do an.
223e0 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e  ** ordinary fsyn
223f0 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65  c() call.  There
22400 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
22410 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45  e between SQLITE
22420 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e  _SYNC_FULL.** an
22430 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  d SQLITE_SYNC_NO
22440 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d  RMAL on platform
22450 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63  s other than Mac
22460 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a  OSX.  But the.**
22470 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
22480 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f  L versus synchro
22490 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74  nous=NORMAL sett
224a0 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ing determines w
224b0 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63  hen.** the xSync
224c0 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61   primitive is ca
224d0 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65  lled and is rele
224e0 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74  vant to all plat
224f0 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  forms..**.** Num
22500 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
22510 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
22520 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
22530 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
22540 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
22550 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22560 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
22570 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
22580 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20  agerSetFlags(.  
22590 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
225a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
225b0 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79  er to set safety
225c0 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20   level for */.  
225d0 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
225e0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
225f0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75   flags */.){.  u
22600 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20  nsigned level = 
22610 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22620 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
22630 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 65  ;.  assert( leve
22640 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33  l>=1 && level<=3
22650 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
22660 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d  Sync =  (level==
22670 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
22680 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
22690 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
226a0 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21  = (level==3 && !
226b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
226c0 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50  ) ?1:0;.  if( pP
226d0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
226e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
226f0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  Flags = 0;.    p
22700 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22710 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
22720 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
22730 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20  PAGER_FULLFSYNC 
22740 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
22750 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22760 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20  E_SYNC_FULL;.   
22770 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22780 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22790 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
227a0 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  se if( pgFlags &
227b0 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c   PAGER_CKPT_FULL
227c0 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
227d0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
227e0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
227f0 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
22800 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
22810 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22820 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
22830 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22840 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22850 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
22860 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
22870 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22880 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50  NORMAL;.  }.  pP
22890 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
228a0 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e  gs = pPager->syn
228b0 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50  cFlags;.  if( pP
228c0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
228d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  {.    pPager->wa
228e0 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41  lSyncFlags |= WA
228f0 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
22900 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONS;.  }.  if( p
22910 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43  gFlags & PAGER_C
22920 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20  ACHESPILL ){.   
22930 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
22940 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
22950 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a  G_OFF;.  }else{.
22960 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
22970 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46  tSpill |= SPILLF
22980 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23  LAG_OFF;.  }.}.#
22990 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
229a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
229b0 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
229c0 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
229d0 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
229e0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
229f0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
22a00 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
22a10 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
22a20 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
22a30 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
22a40 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
22a50 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
22a60 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
22a70 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
22a80 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
22a90 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
22aa0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
22ab0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
22ac0 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
22ad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
22ae0 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
22af0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
22b00 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
22b10 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
22b20 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
22b30 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
22b40 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
22b50 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
22b60 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
22b70 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
22b80 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
22b90 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
22ba0 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
22bb0 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
22bc0 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
22bd0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
22be0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22bf0 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
22c00 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
22c10 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22c20 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
22c30 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22c40 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
22c50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
22c60 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
22c70 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
22c80 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
22c90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
22ca0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
22cb0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
22cc0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
22cd0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
22ce0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
22cf0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
22d00 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
22d10 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
22d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22d30 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
22d40 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
22d50 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
22d60 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
22d70 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
22d80 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
22d90 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
22da0 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
22db0 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
22dc0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
22dd0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
22de0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
22df0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
22e00 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
22e10 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
22e20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
22e30 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
22e40 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
22e50 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
22e60 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
22e70 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
22e80 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
22e90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
22ea0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
22eb0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
22ec0 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
22ed0 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
22ee0 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
22ef0 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
22f00 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
22f10 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
22f20 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
22f30 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
22f40 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
22f50 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
22f60 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
22f70 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
22f80 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
22f90 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
22fa0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
22fb0 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
22fc0 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
22fd0 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
22fe0 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
22ff0 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
23000 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
23010 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
23020 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
23030 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
23040 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
23050 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
23070 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
23080 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
23090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
230a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
230b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
230c0 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
230d0 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
230e0 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
230f0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
23100 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
23110 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
23120 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
23130 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
23140 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
23150 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
23160 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
23170 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
23180 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
23190 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
231a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
231b0 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
231c0 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
231d0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
231e0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
231f0 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
23200 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
23210 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
23220 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
23230 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
23240 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
23250 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
23280 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
23290 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
232a0 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
232b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
232c0 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
232d0 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
232e0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23300 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
23310 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
23320 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72  r */.){.  pPager
23330 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
23340 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
23350 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
23360 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
23370 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69  HandlerArg;..  i
23380 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
23390 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69  ->fd) ){.    voi
233a0 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a  d **ap = (void *
233b0 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79  *)&pPager->xBusy
233c0 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73  Handler;.    ass
233d0 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f  ert( ((int(*)(vo
233e0 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d  id *))(ap[0]))==
233f0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a  xBusyHandler );.
23400 20 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31      assert( ap[1
23410 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41  ]==pBusyHandlerA
23420 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rg );.    sqlite
23430 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
23440 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
23450 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59  QLITE_FCNTL_BUSY
23460 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a  HANDLER, (void *
23470 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  )ap);.  }.}../*.
23480 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  ** Change the pa
23490 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
234a0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
234b0 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73  . The new page s
234c0 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65  ize .** is passe
234d0 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e  d in *pPageSize.
234e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
234f0 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
23500 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
23510 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23520 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73  called, it.** is
23530 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61   a no-op. The va
23540 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
23550 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
23560 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
23570 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49   .** one of SQLI
23580 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c  TE_IOERR, an SQL
23590 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75  ITE_IOERR_xxx su
235a0 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45  b-code or SQLITE
235b0 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
235c0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
235d0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
235e0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
235f0 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
23600 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
23610 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
23620 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
23630 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
23640 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
23650 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
23660 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
23670 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
23680 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
23690 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
236a0 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
236b0 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
236c0 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
236d0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
236e0 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
236f0 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
23700 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
23710 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
23720 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
23730 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
23740 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
23750 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
23760 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
23770 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23780 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
23790 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
237a0 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
237b0 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
237c0 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
237d0 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
237e0 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
237f0 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
23800 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
23810 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
23820 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
23830 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
23840 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
23850 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
23860 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
23870 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
23880 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
23890 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
238a0 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
238b0 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
238c0 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
238d0 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
238e0 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
238f0 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
23900 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
23910 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
23920 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
23930 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
23940 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
23950 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
23960 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
23970 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
23980 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
23990 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
239a0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
239b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
239c0 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
239d0 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65  ager, u32 *pPage
239e0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
239f0 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
23a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
23a10 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
23a20 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c  ble to do a full
23a30 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
23a40 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74  ate() here, as t
23a50 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
23a60 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
23a70 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65  from within Page
23a80 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20  rOpen(), before 
23a90 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f  the state.  ** o
23aa0 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
23ab0 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ct is internally
23ac0 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a   consistent..  *
23ad0 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f  *.  ** At one po
23ae0 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  int this functio
23af0 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  n returned an er
23b00 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72  ror if the pager
23b10 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41   was in .  ** PA
23b20 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
23b30 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52   But since PAGER
23b40 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61  _ERROR state gua
23b50 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a  rantees that.  *
23b60 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65  * there is at le
23b70 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
23b80 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
23b90 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ce, this functio
23ba0 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  n.  ** is a no-o
23bb0 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20  p for that case 
23bc0 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20  anyhow..  */..  
23bd0 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u32 pageSize = *
23be0 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
23bf0 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
23c00 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
23c10 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
23c20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
23c30 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28  SIZE) );.  if( (
23c40 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
23c50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
23c60 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c  ze==0).   && sql
23c70 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
23c80 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
23c90 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61  he)==0 .   && pa
23ca0 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
23cb0 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d  ze!=(u32)pPager-
23cc0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a  >pageSize .  ){.
23cd0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
23ce0 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20   NULL;          
23cf0 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73     /* New temp s
23d00 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20  pace */.    i64 
23d10 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  nByte = 0;..    
23d20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
23d30 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  te>PAGER_OPEN &&
23d40 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
23d50 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  fd) ){.      rc 
23d60 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
23d70 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
23d80 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20  &nByte);.    }. 
23d90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e  E_OK ){.      pN
23db0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
23dc0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
23dd0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
23de0 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d  if( !pNew ) rc =
23df0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23e00 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
23e10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23e20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
23e30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
23e40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
23e50 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70   (Pgno)((nByte+p
23e60 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53  ageSize-1)/pageS
23e70 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
23e80 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
23e90 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73  ageSize;.      s
23ea0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
23eb0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
23ec0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
23ed0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
23ee0 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
23ef0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
23f00 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
23f10 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
23f20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
23f30 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
23f40 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
23f50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23f60 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
23f70 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
23f80 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
23f90 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
23fa0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
23fb0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
23fc0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
23fd0 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
23fe0 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
23ff0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
24000 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61  ;.    pagerFixMa
24010 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
24020 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24040 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24050 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
24060 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
24070 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
24080 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
24090 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
240a0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
240b0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
240c0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
240d0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
240e0 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
240f0 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
24100 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
24110 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
24120 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
24130 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
24140 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
24150 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
24160 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
24170 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
24180 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
24190 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
241a0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
241b0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
241c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
241d0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
241e0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
241f0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
24200 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
24210 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
24220 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
24230 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
24240 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
24250 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
24260 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
24270 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
24280 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
24290 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
242a0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
242b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
242c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
242d0 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
242e0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
242f0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
24300 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
24310 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
24320 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
24330 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
24340 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
24350 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
24360 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
24370 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
24380 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
24390 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
243a0 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
243b0 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
243c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
243d0 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
243e0 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
243f0 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
24400 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
24410 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24420 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
24430 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
24440 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
24450 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
24460 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
24470 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
24480 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
24490 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
244a0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
244b0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
244c0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
244d0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
244e0 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
244f0 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
24500 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
24510 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
24520 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
24530 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
24540 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
24550 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
24560 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
24570 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24580 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
24590 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
245a0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
245b0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
245c0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
245d0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
245e0 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
245f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24600 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
24610 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24620 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
24630 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
24640 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24650 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
24660 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24670 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
24680 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
24690 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
246a0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
246b0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
246c0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
246d0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
246e0 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
246f0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
24700 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
24710 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
24720 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
24730 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
24740 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
24750 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
24760 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
24770 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
24780 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
24790 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
247a0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
247b0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
247c0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
247d0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
247e0 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
247f0 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
24800 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
24810 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
24820 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
24830 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
24840 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
24850 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
24860 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
24870 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
24880 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
24890 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
248a0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
248b0 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
248c0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
248d0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
248e0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
248f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
24900 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
24910 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
24920 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
24930 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
24940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24950 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
24960 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
24970 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
24980 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
24990 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
249a0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
249b0 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
249c0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
249d0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
249e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
249f0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
24a00 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
24a10 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
24a20 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
24a30 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
24a40 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
24a50 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
24a60 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
24a70 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
24a80 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
24a90 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
24aa0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
24ab0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
24ac0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
24ad0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
24ae0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
24af0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
24b00 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
24b10 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
24b20 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
24b30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24b40 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
24b50 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
24b60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
24b70 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
24b80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24b90 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24ba0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
24bb0 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
24bc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
24bd0 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
24be0 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
24bf0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
24c00 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
24c10 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
24c20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
24c30 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
24c40 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
24c50 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
24c60 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
24c70 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
24c80 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
24c90 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
24ca0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
24cb0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
24cc0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
24cd0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24ce0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
24cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
24d00 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
24d10 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
24d20 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
24d30 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
24d40 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
24d50 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
24d60 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
24d70 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
24d80 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
24d90 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
24da0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
24db0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
24dc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
24dd0 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
24de0 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
24df0 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
24e00 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
24e10 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
24e20 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
24e30 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
24e40 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
24e50 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
24e60 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
24e70 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
24e80 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
24e90 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
24ea0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
24eb0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
24ec0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
24ed0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
24ee0 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
24ef0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24f00 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
24f10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
24f20 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
24f30 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
24f40 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
24f50 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
24f60 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
24f70 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
24f80 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
24f90 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
24fa0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
24fb0 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
24fc0 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
24fd0 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
24fe0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25010 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
25020 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
25030 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
25040 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
25050 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
25060 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
25070 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
25080 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
25090 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
250a0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
250b0 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
250c0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
250d0 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
250e0 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
250f0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
25100 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
25110 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
25120 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
25130 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
25140 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
25150 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
25160 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
25170 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
25180 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
25190 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
251a0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
251b0 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
251c0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
251d0 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
251e0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
251f0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
25200 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
25210 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
25220 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
25230 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
25240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
25250 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
25260 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
25270 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
25280 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
25290 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
252a0 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
252b0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
252c0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
252d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
252e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
252f0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
25300 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
25310 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
25320 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
25330 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
25340 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
25350 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
25360 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
25370 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
25380 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
25390 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
253a0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
253b0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
253c0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
253d0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
253e0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
253f0 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
25400 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
25410 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
25420 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
25430 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
25440 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
25450 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
25460 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
25470 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
25480 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
25490 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
254a0 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
254b0 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
254c0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
254d0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
254e0 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
254f0 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
25500 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
25510 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
25520 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
25530 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
25540 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
25550 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
25560 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
25570 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
25580 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
25590 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
255a0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
255b0 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
255c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
255d0 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
255e0 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
255f0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
25600 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
25610 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
25620 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
25630 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
25640 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25650 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
25660 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
25670 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
25680 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
25690 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
256a0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
256b0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
256c0 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
256d0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
256e0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
256f0 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
25700 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
25710 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
25720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
25730 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
25740 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
25750 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
25760 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
25770 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
25780 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25790 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
257a0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
257b0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
257c0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
257d0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
257e0 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
257f0 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
25800 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25810 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
25820 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
25830 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
25840 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
25850 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
25860 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
25870 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
25880 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
25890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
258a0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
258b0 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
258c0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
258d0 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
258e0 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
258f0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
25900 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
25910 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
25920 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
25930 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  itted..**.** Thi
25940 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
25950 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ly called right 
25960 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
25970 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
25980 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75  .** Once this fu
25990 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
259a0 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e  called, the tran
259b0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74  saction must eit
259c0 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64  her be.** rolled
259d0 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74   back or committ
259e0 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61  ed. It is not sa
259f0 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  fe to call this 
25a00 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
25a10 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72  then continue wr
25a20 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
25a30 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
25a40 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
25a50 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
25a60 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
25a70 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
25a80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
25a90 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
25aa0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25ab0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
25ac0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
25ad0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
25ae0 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e  age;..  /* At on
25af0 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65  e point the code
25b00 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73   here called ass
25b10 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25b20 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20  raint() to.  ** 
25b30 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  ensure that all 
25b40 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e  pages being trun
25b50 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68  cated away by th
25b60 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65  is operation are
25b70 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72  ,.  ** if one or
25b80 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
25b90 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65   are open, prese
25ba0 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f  nt in the savepo
25bb0 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  int .  ** journa
25bc0 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  l so that they c
25bd0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
25be0 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
25bf0 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
25c00 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  ack. This is no 
25c10 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
25c20 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
25c30 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20  n is now only.  
25c40 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ** called right 
25c50 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
25c60 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
25c70 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65   So although the
25c80 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a   .  ** Pager obj
25c90 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ect may still ha
25ca0 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ve open savepoin
25cb0 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ts (Pager.nSavep
25cc0 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20  oint!=0), .  ** 
25cd0 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72  they cannot be r
25ce0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74  olled back. So t
25cf0 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  he assertTruncat
25d00 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61  eConstraint() ca
25d10 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f  ll.  ** is no lo
25d20 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f  nger correct. */
25d30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
25d40 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
25d50 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
25d60 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
25d70 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
25d80 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
25d90 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
25da0 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
25db0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
25dc0 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
25dd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
25de0 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
25df0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
25e00 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
25e10 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
25e20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
25e30 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
25e40 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
25e50 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
25e60 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
25e70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
25e80 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
25e90 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
25ea0 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
25eb0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
25ec0 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
25ed0 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
25ee0 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
25ef0 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
25f00 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
25f10 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
25f20 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
25f30 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
25f40 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
25f50 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
25f60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
25f70 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
25f80 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
25f90 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
25fa0 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
25fb0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
25fc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
25fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25fe0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
25ff0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
26000 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26010 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
26020 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
26030 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
26040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
26060 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
26070 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
26080 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
26090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
260a0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65  *.** Obtain a re
260b0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d  ference to a mem
260c0 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
260d0 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20  object for page 
260e0 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a  number pgno. .**
260f0 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
26100 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69  will use the poi
26110 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61  nter pData, obta
26120 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68  ined from xFetch
26130 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  ()..** If succes
26140 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67  sful, set *ppPag
26150 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
26160 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72  e new page refer
26170 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75  ence.** and retu
26180 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
26190 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
261a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
261b0 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20  code and set.** 
261c0 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e  *ppPage to zero.
261d0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65  .**.** Page refe
261e0 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20  rences obtained 
261f0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
26200 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
26210 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62  be released.** b
26220 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52  y calling pagerR
26230 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e  eleaseMapPage().
26240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26250 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
26260 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
26270 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
26280 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
26290 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  bject */.  Pgno 
262a0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
262b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
262c0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76  ge number */.  v
262d0 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20  oid *pData,     
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
262f0 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74  * xFetch()'d dat
26300 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  a for this page 
26310 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  */.  PgHdr **ppP
26320 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20  age             
26330 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71       /* OUT: Acq
26340 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63  uired page objec
26350 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  t */.){.  PgHdr 
26360 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
26370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
26380 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
26390 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20  to return */..  
263a0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  if( pPager->pMma
263b0 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20  pFreelist ){.   
263c0 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70   *ppPage = p = p
263d0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
263e0 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  list;.    pPager
263f0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
26400 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
26410 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a   p->pDirty = 0;.
26420 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45      memset(p->pE
26430 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  xtra, 0, pPager-
26440 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73  >nExtra);.  }els
26450 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
26460 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71   p = (PgHdr *)sq
26470 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
26480 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20  sizeof(PgHdr) + 
26490 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
264a0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
264b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
264c0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
264d0 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
264e0 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
264f0 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
26500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26510 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
26520 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28     p->pExtra = (
26530 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20  void *)&p[1];.  
26540 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48    p->flags = PGH
26550 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e  DR_MMAP;.    p->
26560 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d  nRef = 1;.    p-
26570 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
26580 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
26590 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69   p->pExtra==(voi
265a0 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61  d *)&p[1] );.  a
265b0 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d  ssert( p->pPage=
265c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
265d0 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f  p->flags==PGHDR_
265e0 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74  MMAP );.  assert
265f0 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ( p->pPager==pPa
26600 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
26610 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a   p->nRef==1 );..
26620 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f    p->pgno = pgno
26630 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70  ;.  p->pData = p
26640 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Data;.  pPager->
26650 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72  nMmapOut++;..  r
26660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
26680 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
26690 20 70 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d   page pPg. pPg m
266a0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
266b0 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a  turned by an .**
266c0 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
266d0 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
266e0 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
266f0 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65  c void pagerRele
26700 61 73 65 4d 61 70 50 61 67 65 28 50 67 48 64 72  aseMapPage(PgHdr
26710 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
26720 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
26730 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  Pager;.  pPager-
26740 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70  >nMmapOut--;.  p
26750 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
26760 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26770 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d  st;.  pPager->pM
26780 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50  mapFreelist = pP
26790 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
267a0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
267b0 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20  ds->iVersion>=3 
267c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  );.  sqlite3OsUn
267d0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
267e0 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e  , (i64)(pPg->pgn
267f0 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
26800 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74  eSize, pPg->pDat
26810 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  a);.}../*.** Fre
26820 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65  e all PgHdr obje
26830 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  cts stored in th
26840 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65  e Pager.pMmapFre
26850 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73  elist list..*/.s
26860 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
26870 46 72 65 65 4d 61 70 48 64 72 73 28 50 61 67 65  FreeMapHdrs(Page
26880 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
26890 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20  Hdr *p;.  PgHdr 
268a0 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
268b0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
268c0 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78  elist; p; p=pNex
268d0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
268e0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73  p->pDirty;.    s
268f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
26900 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68    }.}.../*.** Sh
26910 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
26920 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
26930 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
26940 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
26950 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
26960 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
26970 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
26980 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
26990 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
269a0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
269b0 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
269c0 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
269d0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
269e0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
269f0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
26a00 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
26a10 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
26a20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
26a30 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
26a40 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
26a50 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
26a60 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
26a70 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
26a80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
26a90 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
26aa0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
26ab0 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
26ac0 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
26ad0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
26ae0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
26af0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
26b00 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
26b10 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
26b20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
26b30 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
26b40 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
26b50 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
26b60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26b70 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
26b80 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
26b90 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
26ba0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
26bb0 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
26bc0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
26bd0 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61  Pager) );.  disa
26be0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
26bf0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
26c00 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
26c10 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72  alloc();.  pager
26c20 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61 67  FreeMapHdrs(pPag
26c30 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  er);.  /* pPager
26c40 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a  ->errCode = 0; *
26c50 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  /.  pPager->excl
26c60 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23  usiveMode = 0;.#
26c70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26c80 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33  IT_WAL.  sqlite3
26c90 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  WalClose(pPager-
26ca0 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63  >pWal, pPager->c
26cb0 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50  kptSyncFlags, pP
26cc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
26cd0 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d  pTmp);.  pPager-
26ce0 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  >pWal = 0;.#endi
26cf0 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  f.  pager_reset(
26d00 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d  pPager);.  if( M
26d10 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65  EMDB ){.    page
26d20 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
26d30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26d40 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c  * If it is open,
26d50 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
26d60 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  l file before ca
26d70 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52  lling UnlockAndR
26d80 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  ollback..    ** 
26d90 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64  If this is not d
26da0 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73  one, then an uns
26db0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
26dc0 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
26dd0 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d  l .    ** file m
26de0 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ay be played bac
26df0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
26e00 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
26e10 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a  failure occurs .
26e20 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69      ** while thi
26e30 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
26e40 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
26e50 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
26e60 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
26e70 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26e80 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
26e90 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75   to sync the jou
26ea0 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20  rnal, shift the 
26eb0 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74  pager.    ** int
26ec0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
26ed0 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55  e. This causes U
26ee0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
26ef0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20   to unlock the. 
26f00 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
26f10 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  nd close the jou
26f20 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75  rnal file withou
26f30 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
26f40 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62  roll it.    ** b
26f50 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20  ack or finalize 
26f60 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74  it. The next dat
26f70 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20  abase user will 
26f80 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a  have to do hot-j
26f90 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f  ournal.    ** ro
26fa0 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63  llback before ac
26fb0 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
26fc0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
26fd0 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  /.    if( isOpen
26fe0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
26ff0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
27000 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72  or(pPager, pager
27010 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
27020 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
27030 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
27040 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
27050 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
27060 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
27070 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
27080 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
27090 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
270a0 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
270b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
270c0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
270d0 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
270e0 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
270f0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
27100 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  );.  sqlite3OsCl
27110 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
27120 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
27130 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69  ee(pTmp);.  sqli
27140 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
27150 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
27160 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
27170 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
27180 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
27190 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
271a0 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
271b0 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a  pCodec);.#endif.
271c0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
271d0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26  er->aSavepoint &
271e0 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  & !pPager->pInJo
271f0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
27200 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
27210 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
27220 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
27230 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   );..  sqlite3_f
27240 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
27250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27260 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
27270 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
27280 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
27290 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
272a0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
272b0 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50  r page pPg..*/.P
272c0 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
272d0 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
272e0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
272f0 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  n pPg->pgno;.}.#
27300 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
27310 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
27320 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
27330 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64  age pPg..*/.void
27340 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
27350 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
27360 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
27370 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f(pPg);.}../*.**
27380 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
27390 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
273a0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
273b0 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
273c0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
273d0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
273e0 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
273f0 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
27400 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
27410 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20  disk and can be 
27420 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  restored in the 
27430 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a  event of a hot-j
27440 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
27450 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61  .**.** If the Pa
27460 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20  ger.noSync flag 
27470 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  is set, then thi
27480 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
27490 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77  no-op..** Otherw
274a0 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
274b0 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
274c0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
274d0 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a  mode and the .**
274e0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
274f0 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66  ristics of the f
27500 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
27510 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
27520 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
27530 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
27540 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
27550 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
27560 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
27570 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
27580 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
27590 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
275a0 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
275b0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
275c0 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
275d0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
275e0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
275f0 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
27600 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
27610 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
27620 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
27630 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
27640 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
27650 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
27660 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
27670 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
27680 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
27690 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
276a0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
276b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
276c0 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
276d0 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
276e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
276f0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
27700 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
27710 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
27720 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
27730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27740 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
27750 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
27760 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
27770 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
27780 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
27790 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
277a0 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
277b0 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
277c0 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
277d0 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
277e0 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
277f0 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
27800 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
27810 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
27820 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
27830 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
27840 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
27850 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
27860 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
27870 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
27880 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
27890 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
278a0 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
278b0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
278c0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
278d0 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
278e0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
278f0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
27900 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
27910 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
27920 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
27930 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
27940 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72  ager, int newHdr
27950 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
27980 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
27990 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
279a0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
279b0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
279c0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
279d0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
279e0 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
279f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
27a00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
27a10 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
27a20 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
27a30 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
27a40 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
27a50 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
27a60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27a70 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
27a80 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
27a90 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
27aa0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
27ab0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
27ac0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
27ad0 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
27ae0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
27af0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
27b00 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
27b10 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
27b20 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
27b30 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
27b40 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
27b50 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
27b60 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
27b70 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
27b80 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
27b90 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
27ba0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
27bb0 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
27bc0 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
27bd0 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
27be0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
27bf0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
27c00 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
27c10 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
27c20 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
27c30 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
27c40 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
27c50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27c60 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
27c70 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
27c80 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
27c90 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
27ca0 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
27cb0 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
27cc0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
27cd0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
27ce0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
27cf0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
27d00 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
27d10 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
27d20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
27d30 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
27d40 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
27d50 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
27d60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
27d70 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
27d80 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
27d90 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
27da0 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
27db0 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
27dc0 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
27dd0 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
27de0 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
27df0 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
27e00 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
27e10 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
27e20 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
27e30 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
27e40 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
27e50 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
27e60 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
27e70 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
27e80 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
27e90 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
27ea0 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
27eb0 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
27ec0 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
27ed0 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
27ee0 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
27ef0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
27f00 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
27f10 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
27f20 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
27f30 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
27f40 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
27f50 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
27f60 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
27f70 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
27f80 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
27f90 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
27fa0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
27fb0 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
27fc0 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
27fd0 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
27fe0 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
27ff0 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
28000 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28010 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
28020 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
28030 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
28040 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
28050 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
28060 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
28070 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
28080 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
28090 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
280a0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
280b0 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
280c0 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
280d0 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
280e0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
280f0 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
28100 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
28110 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
28120 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
28130 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
28140 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
28150 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
28160 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
28170 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
28180 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
28190 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
281a0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
281b0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
281c0 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
281d0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
281e0 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
281f0 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
28200 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
28210 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
28220 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
28230 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
28240 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
28250 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
28260 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
28270 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28280 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
28290 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
282a0 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
282b0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
282c0 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
282d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
282e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
282f0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
28300 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
28310 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
28320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28330 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28340 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
28350 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
28360 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
28370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28380 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
28390 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
283a0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
283b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
283c0 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
283d0 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
283e0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
283f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
28400 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
28410 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
28420 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
28430 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
28440 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
28450 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
28460 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
28470 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
28480 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
28490 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
284a0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
284b0 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
284c0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
284d0 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
284e0 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
284f0 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
28500 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
28510 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
28520 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
28530 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
28540 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
28550 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
28560 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
28570 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
28580 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
28590 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
285a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
285b0 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
285c0 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
285d0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
285e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
285f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
28600 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
28610 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
28620 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
28630 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
28640 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
28650 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
28660 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
28670 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
28680 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
28690 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
286a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
286b0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
286c0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
286d0 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
286e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
286f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28700 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
28710 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28720 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
28730 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
28740 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
28750 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28760 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
28770 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28780 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
28790 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
287a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
287b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
287c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
287d0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
287e0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
287f0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
28800 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
28810 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
28820 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
28830 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
28840 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28850 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
28860 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28870 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
28880 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28890 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
288a0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
288b0 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20  syncFlags| .    
288c0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
288d0 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  yncFlags==SQLITE
288e0 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
288f0 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
28900 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
28910 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28920 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
28930 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
28940 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
28950 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
28960 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
28970 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
28980 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28990 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
289a0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
289b0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
289c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
289d0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
289e0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
289f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28a00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28a10 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
28a20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
28a30 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
28a40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
28a50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
28a60 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
28a70 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
28a80 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
28a90 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
28aa0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
28ab0 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
28ac0 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
28ad0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
28ae0 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
28af0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
28b00 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
28b10 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
28b20 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
28b30 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
28b40 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
28b50 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
28b60 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
28b70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
28b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28b90 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
28ba0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
28bb0 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
28bc0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
28bd0 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
28be0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
28bf0 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
28c00 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
28c10 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
28c20 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
28c30 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
28c40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28c50 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
28c60 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
28c70 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
28c80 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
28c90 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
28ca0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
28cb0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
28cc0 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
28cd0 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
28ce0 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
28cf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
28d00 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
28d10 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
28d20 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
28d30 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
28d40 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
28d50 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
28d60 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
28d70 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
28d80 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
28d90 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
28da0 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
28db0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
28dc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28dd0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
28de0 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
28df0 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
28e00 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
28e10 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
28e20 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
28e30 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
28e40 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
28e50 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
28e60 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
28e70 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
28e80 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
28e90 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
28ea0 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
28eb0 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
28ec0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
28ed0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
28ee0 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
28ef0 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
28f00 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
28f10 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
28f20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
28f30 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
28f40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
28f50 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
28f60 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
28f70 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
28f80 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
28f90 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
28fa0 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
28fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
28fc0 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
28fd0 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
28fe0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
28ff0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
29000 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
29010 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
29020 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
29030 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
29040 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
29050 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
29060 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
29070 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
29080 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
29090 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
290a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
290b0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
290c0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
290d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
290e0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
290f0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
29100 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
29110 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
29120 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
29130 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
29140 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
29150 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
29160 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
29170 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
29180 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
29190 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
291a0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
291b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
291c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
291d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
291e0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
291f0 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
29200 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61   for rollback pa
29210 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44  gers in WRITER_D
29220 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  BMOD state. */. 
29230 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
29240 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
29250 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29260 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
29270 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b  _WRITER_DBMOD );
29280 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29290 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
292a0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
292b0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
292c0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73   a temp-file has
292d0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
292e0 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
292f0 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f  w. It.  ** is no
29300 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  t possible for r
29310 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68  c to be other th
29320 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
29330 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
29340 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61   is taken, as pa
29350 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
29360 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
29370 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20  r temp-files..  
29380 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
29390 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
293a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
293b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
293c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
293d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
293e0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
293f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
29400 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
29410 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
29420 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c  the first write,
29430 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20   give the VFS a 
29440 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65  hint of what the
29450 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65   final.  ** file
29460 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20   size will be.. 
29470 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
29480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
29490 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
294a0 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ) );.  if( rc==S
294b0 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
294c0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
294d0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
294e0 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e  e.   && (pList->
294f0 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d  pDirty || pList-
29500 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
29510 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20  HintSize).  ){. 
29520 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
29530 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72   szFile = pPager
29540 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71  ->pageSize * (sq
29550 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67  lite3_int64)pPag
29560 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
29570 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
29580 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
29590 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
295a0 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a  L_SIZE_HINT, &sz
295b0 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65  File);.    pPage
295c0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
295d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
295e0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
295f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
29600 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
29610 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
29620 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
29630 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
29640 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
29650 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
29660 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
29670 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
29680 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
29690 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
296a0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
296b0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
296c0 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
296d0 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
296e0 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
296f0 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
29700 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
29710 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
29720 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
29730 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
29740 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
29750 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
29760 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
29770 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
29780 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
29790 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
297a0 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
297b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
297c0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
297d0 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
297e0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
297f0 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
29800 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
29810 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
29820 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
29830 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
29840 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
29850 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
29880 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
29890 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74    ..      assert
298a0 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ( (pList->flags&
298b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
298c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
298d0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
298e0 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
298f0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
29900 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  t);..      /* En
29910 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
29920 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
29930 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
29940 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
29950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
29960 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20  OMEM, pData);.. 
29970 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
29980 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
29990 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
299a0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
299b0 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
299c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
299d0 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
299e0 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
299f0 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
29a00 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
29a10 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
29a20 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
29a30 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
29a40 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
29a50 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
29a60 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
29a70 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
29a80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29a90 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
29aa0 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
29ab0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
29ac0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
29ad0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
29ae0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
29af0 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
29b00 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
29b10 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
29b20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
29b30 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
29b40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
29b50 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
29b60 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20   pgno;.      }. 
29b70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
29b80 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
29b90 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  ITE]++;..      /
29ba0 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63  * Update any bac
29bb0 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79  kup objects copy
29bc0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
29bd0 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20   of this pager. 
29be0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
29bf0 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
29c00 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
29c10 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e  no, (u8*)pList->
29c20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
29c30 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
29c40 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
29c50 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
29c70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
29c80 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
29c90 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
29ca0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
29cb0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
29cc0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
29cd0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
29ce0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
29cf0 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
29d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
29d10 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
29d20 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
29d30 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29d40 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
29d50 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
29d60 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
29d70 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
29d80 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
29d90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29da0 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
29db0 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
29dc0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
29dd0 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
29de0 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
29df0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
29e00 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
29e10 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
29e20 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
29e30 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
29e40 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
29e50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
29e60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29e70 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
29e80 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
29e90 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
29ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
29eb0 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
29ec0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
29ed0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29ee0 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
29ef0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
29f00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
29f10 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
29f20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
29f30 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
29f40 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
29f50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
29f60 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
29f70 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
29f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
29f90 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
29fa0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
29fb0 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
29fc0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
29fd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29fe0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29ff0 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
2a000 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2a010 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
2a020 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2a030 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
2a040 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
2a050 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
2a060 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2a070 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
2a080 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
2a090 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
2a0a0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
2a0b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2a0c0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2a0d0 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
2a0e0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
2a0f0 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
2a100 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
2a110 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
2a120 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2a130 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2a140 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2a150 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
2a160 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2a170 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
2a180 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
2a190 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
2a1a0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2a1b0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
2a1c0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
2a1d0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
2a1e0 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
2a1f0 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
2a200 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
2a210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
2a220 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
2a230 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
2a240 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a250 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2a260 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2a270 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2a280 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2a290 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2a2a0 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
2a2b0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
2a2c0 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
2a2d0 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
2a2e0 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
2a2f0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2a300 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
2a310 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2a320 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
2a330 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2a340 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2a350 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2a360 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
2a370 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
2a380 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
2a390 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
2a3a0 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
2a3b0 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20  urnal(pPg) .    
2a3c0 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
2a3d0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
2a3e0 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
2a3f0 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
2a400 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
2a410 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2a420 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
2a430 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
2a440 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
2a450 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
2a460 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
2a470 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2a480 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
2a490 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a4a0 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
2a4b0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
2a4c0 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
2a4d0 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67  fset = (i64)pPag
2a4e0 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
2a4f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2a500 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
2a510 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43  ata2;.  .      C
2a520 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
2a530 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
2a540 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
2a550 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
2a560 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2a570 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
2a580 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2a590 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2a5a0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2a5b0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2a5c0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
2a5d0 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
2a5e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2a5f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a600 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2a610 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2a620 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
2a630 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
2a640 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
2a650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a660 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2a670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2a680 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
2a690 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a6a0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
2a6b0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
2a6c0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2a6d0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2a6e0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
2a6f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a700 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a710 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
2a720 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
2a730 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
2a740 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
2a750 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
2a760 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
2a770 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2a780 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
2a790 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
2a7a0 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
2a7b0 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
2a7c0 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
2a7d0 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
2a7e0 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
2a7f0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
2a800 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
2a810 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
2a820 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
2a830 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
2a840 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
2a850 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
2a860 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
2a870 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
2a880 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
2a890 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
2a8a0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
2a8b0 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
2a8c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
2a8d0 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
2a8e0 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
2a8f0 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
2a900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a910 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
2a920 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
2a930 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
2a940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
2a950 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2a960 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
2a970 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2a980 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
2a990 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
2a9a0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2a9b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2a9c0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2a9d0 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
2a9e0 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
2a9f0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2aa00 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
2aa10 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
2aa20 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
2aa30 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
2aa40 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
2aa50 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
2aa60 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2aa70 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2aa80 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2aa90 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
2aaa0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2aab0 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
2aac0 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
2aad0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2aae0 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
2aaf0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2ab00 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2ab10 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
2ab20 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
2ab30 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
2ab40 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
2ab50 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   /* The doNotSpi
2ab60 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73  ll NOSYNC bit is
2ab70 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65   set during time
2ab80 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73  s when doing a s
2ab90 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72  ync of.  ** jour
2aba0 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20  nal (and adding 
2abb0 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73  a new header) is
2abc0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54   not allowed.  T
2abd0 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  his occurs.  ** 
2abe0 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20  during calls to 
2abf0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ac00 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67  e() while trying
2ac10 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74   to journal mult
2ac20 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  iple.  ** pages 
2ac30 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
2ac40 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20   same sector..  
2ac50 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f  **.  ** The doNo
2ac60 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  tSpill ROLLBACK 
2ac70 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68  and OFF bits inh
2ac80 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20  ibits all cache 
2ac90 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65  spilling.  ** re
2aca0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2acb0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e  her or not a syn
2acc0 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  c is required.  
2acd0 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69  This is set duri
2ace0 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  ng.  ** a rollba
2acf0 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65  ck or by user re
2ad00 71 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76  quest, respectiv
2ad10 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ely..  **.  ** S
2ad20 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
2ad30 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
2ad40 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
2ad50 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
2ad60 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
2ad70 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
2ad80 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
2ad90 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
2ada0 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ton it .  ** is 
2adb0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2adc0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2add0 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2ade0 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2adf0 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==1.  ** while i
2ae00 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2ae10 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2ae20 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2ae30 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2ae40 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2ae50 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2ae60 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2ae70 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2ae80 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2ae90 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2aea0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2aeb0 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2aec0 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2aed0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2aee0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2aef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2af00 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2af10 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2af20 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2af30 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2af40 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2af50 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2af60 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2af70 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2af80 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2af90 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2afa0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2afb0 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2afc0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2afd0 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2afe0 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2aff0 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2b000 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2b010 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2b020 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2b030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b040 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2b050 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2b060 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2b070 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2b080 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2b090 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2b0a0 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2b0b0 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
2b0c0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2b0d0 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62   .      rc = sub
2b0e0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2b0f0 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ; .    }.    if(
2b100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b110 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2b120 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2b130 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2b140 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b150 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2b160 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b170 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2b180 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2b190 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2b1a0 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2b1b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2b1c0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2b1d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2b1e0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2b1f0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2b200 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2b210 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2b220 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
2b230 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
2b240 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
2b250 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
2b260 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
2b270 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
2b280 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
2b290 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68  urnal..    ** Th
2b2a0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
2b2b0 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
2b2c0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
2b2d0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
2b2e0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
2b2f0 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68  write data to th
2b300 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  e file in this c
2b310 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ase..    **.    
2b320 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
2b330 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
2b340 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
2b350 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45    **.    **   BE
2b360 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  GIN;.    **     
2b370 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
2b380 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  .    **     <mod
2b390 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20  ify page X>.    
2b3a0 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
2b3b0 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20   sp;.    **     
2b3c0 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61    <shrink databa
2b3d0 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67  se file to Y pag
2b3e0 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  es>.    **      
2b3f0 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67   pagerStress(pag
2b400 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X).    **     
2b410 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
2b420 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
2b430 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
2b440 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
2b450 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
2b460 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
2b470 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f  en.    ** out to
2b480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b490 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
2b4a0 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
2b4b0 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
2b4c0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
2b4d0 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
2b4e0 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
2b4f0 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
2b500 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64  ll read.    ** d
2b510 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
2b520 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
2b530 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
2b540 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
2b550 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65  t.    ** was whe
2b560 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
2b570 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61  n started, not a
2b580 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53  s it was when "S
2b590 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20  AVEPOINT sp".   
2b5a0 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64   ** was executed
2b5b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b5c0 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
2b5d0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
2b5e0 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61  rent data for pa
2b5f0 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20  ge X into the . 
2b600 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61     ** sub-journa
2b610 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
2b620 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2b630 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
2b640 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   it will.    ** 
2b650 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
2b660 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
2b670 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
2b680 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
2b690 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a     ** executed..
2b6a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e      */.    if( N
2b6b0 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63  EVER(.        rc
2b6c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2b6d0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2b6e0 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52  >dbSize && subjR
2b6f0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
2b700 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20  .    ) ){.      
2b710 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2b720 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
2b730 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
2b740 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2b750 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
2b760 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b770 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
2b780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b790 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
2b7a0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2b7b0 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2b7c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b7d0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2b7e0 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20  pPager, pPg);.  
2b7f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
2b800 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
2b810 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
2b820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b830 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b840 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
2b850 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2b860 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2b870 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
2b880 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2b890 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
2b8a0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
2b8b0 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a  pPager, rc); .}.
2b8c0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2b8d0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2b8e0 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
2b8f0 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
2b900 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
2b910 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
2b920 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
2b930 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
2b940 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
2b950 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2b960 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
2b970 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
2b980 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
2b990 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
2b9a0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
2b9b0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
2b9c0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
2b9d0 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
2b9e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2b9f0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
2ba00 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
2ba10 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
2ba20 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
2ba30 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
2ba40 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
2ba50 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
2ba60 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
2ba70 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
2ba80 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
2ba90 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
2baa0 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
2bab0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
2bac0 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
2bad0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
2bae0 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
2baf0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
2bb00 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
2bb10 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
2bb20 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
2bb30 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2bb40 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
2bb50 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
2bb60 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
2bb70 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
2bb80 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2bb90 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
2bba0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2bbb0 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
2bbc0 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
2bbd0 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
2bbe0 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
2bbf0 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
2bc00 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
2bc10 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
2bc20 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
2bc30 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
2bc40 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
2bc50 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  he PAGER_* flags
2bc60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
2bc70 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
2bc80 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
2bc90 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
2bca0 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
2bcb0 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
2bcc0 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
2bcd0 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
2bce0 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
2bcf0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
2bd00 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
2bd10 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
2bd20 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
2bd30 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
2bd40 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
2bd50 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2bd60 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
2bd70 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
2bd80 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
2bd90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2bda0 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
2bdb0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
2bdc0 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
2bdd0 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
2bde0 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
2bdf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
2be00 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
2be10 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
2be20 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
2be30 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
2be40 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
2be50 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
2be60 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2be70 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
2be80 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2be90 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
2bea0 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
2beb0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
2bec0 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
2bed0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2bee0 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
2bef0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2bf00 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2bf10 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
2bf20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2bf30 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2bf40 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
2bf50 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
2bf60 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
2bf70 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
2bf80 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2bf90 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2bfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2bfb0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
2bfc0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2bfd0 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
2bfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2bff0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
2c000 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
2c010 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
2c020 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
2c030 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
2c040 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
2c050 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
2c060 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
2c070 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
2c080 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
2c090 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
2c0a0 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2c0b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c0c0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
2c0d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2c0e0 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
2c0f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2c100 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
2c110 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
2c120 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
2c130 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
2c140 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2c150 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2c160 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
2c170 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
2c180 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2c190 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
2c1a0 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
2c1b0 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
2c1c0 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
2c1d0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2c1e0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2c1f0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
2c200 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2c210 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
2c220 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2c230 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
2c240 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
2c250 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2c260 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
2c270 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
2c280 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
2c290 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
2c2a0 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
2c2b0 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
2c2c0 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
2c2d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
2c2e0 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
2c2f0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2c300 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
2c310 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74    u32 szPageDflt
2c320 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2c330 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
2c340 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
2c350 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ze */.  const ch
2c360 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20  ar *zUri = 0;   
2c370 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20   /* URI args to 
2c380 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  copy */.  int nU
2c390 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ri = 0;         
2c3a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c3b0 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67  bytes of URI arg
2c3c0 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20  s at *zUri */.. 
2c3d0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2c3e0 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
2c3f0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
2c400 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
2c410 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
2c420 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
2c430 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
2c440 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
2c450 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a  -journal). This.
2c460 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69    ** is the maxi
2c470 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
2c480 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ed for an in-mem
2c490 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
2c4a0 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e   handle .  ** an
2c4b0 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72  d a regular jour
2c4c0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e  nal file-handle.
2c4d0 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65   Note that a "re
2c4e0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61  gular journal-ha
2c4f0 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62  ndle".  ** may b
2c500 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61  e a wrapper capa
2c510 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74  ble of caching t
2c520 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e  he first portion
2c530 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
2c540 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d    ** file in mem
2c550 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ory to implement
2c560 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2c570 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28  e optimization (
2c580 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65  see .  ** source
2c590 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29   file journal.c)
2c5a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
2c5b0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2c5c0 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d  pVfs)>sqlite3Mem
2c5d0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b  JournalSize() ){
2c5e0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2c5f0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2c600 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
2c610 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65  (pVfs));.  }else
2c620 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
2c630 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2c640 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2c650 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20  Size());.  }..  
2c660 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
2c670 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
2c680 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
2c690 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
2c6a0 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
2c6b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c6c0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69  MIT_MEMORYDB.  i
2c6d0 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2c6e0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d  _MEMORY ){.    m
2c6f0 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66  emDb = 1;.    if
2c700 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2c710 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2c720 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d       zPathname =
2c730 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2c740 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (0, zFilename);.
2c750 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e        if( zPathn
2c760 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e  ame==0  ) return
2c770 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c780 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d       nPathname =
2c790 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c7a0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2c7b0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
2c7c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2c7d0 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  if..  /* Compute
2c7e0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
2c7f0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
2c800 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
2c810 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
2c820 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
2c830 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
2c840 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
2c850 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2c860 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
2c870 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
2c880 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
2c890 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
2c8a0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2c8b0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2c8c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c8d0 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2c8e0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
2c8f0 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
2c900 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ame = sqlite3DbM
2c910 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74  allocRaw(0, nPat
2c920 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2c930 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2c940 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2c950 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2c960 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2c970 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2c980 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2c990 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2c9a0 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2c9b0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2c9c0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2c9d0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2c9e0 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2c9f0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2ca00 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2ca10 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2ca20 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2ca30 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2ca40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ca50 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2ca60 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2ca70 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2ca80 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2ca90 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2caa0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2cab0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2cac0 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2cad0 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2cae0 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2caf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cb00 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2cb10 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2cb20 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2cb30 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2cb40 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2cb50 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2cb60 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2cb70 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2cb80 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2cb90 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2cba0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2cbb0 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2cbc0 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2cbd0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2cbe0 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2cbf0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2cc00 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2cc10 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2cc20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2cc30 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2cc40 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2cc50 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2cc60 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2cc70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cc80 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2cc90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2cca0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ccb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2ccc0 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2ccd0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2cce0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2ccf0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2cd00 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2cd10 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2cd20 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2cd30 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2cd40 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2cd50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2cd60 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2cd70 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2cd80 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2cd90 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2cda0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2cdb0 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2cdc0 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2cdd0 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2cde0 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2cdf0 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2ce00 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2ce10 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2ce20 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2ce30 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2ce40 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2ce50 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2ce60 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2ce70 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2ce80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2ce90 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2cea0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2ceb0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2cec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2ced0 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2cee0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2cef0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2cf00 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2cf20 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2cf30 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2cf40 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2cf50 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2cf60 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2cf70 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2cf80 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2cf90 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2cfa0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2cfb0 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2cfc0 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2cfd0 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2cfe0 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2cff0 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2d000 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2d010 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2d020 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2d030 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2d040 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2d050 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2d060 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2d070 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2d080 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2d090 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2d0a0 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2d0b0 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2d0c0 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20  e + 8 + 2       
2d0d0 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2d0e0 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2d0f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2d100 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2d110 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  4 + 2           
2d120 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2d130 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2d140 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2d150 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2d160 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2d170 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2d180 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2d190 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2d1a0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d1b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d1c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
2d1d0 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2d1e0 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2d1f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2d200 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2d210 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d220 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2d230 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2d240 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2d250 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2d260 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d270 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2d280 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2d290 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2d2a0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2d2b0 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2d2c0 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2d2d0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2d2e0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2d2f0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2d300 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2d310 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d320 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2d330 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2d340 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2d350 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2d360 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2d370 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2d380 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2d390 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2d3a0 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2d3b0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2d3c0 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2d3d0 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2d3e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2d3f0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2d400 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d410 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2d420 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2d430 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2d440 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d450 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70  if( nUri ) memcp
2d460 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2d470 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2d480 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2d490 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2d4a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2d4b0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d4c0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2d4d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d4e0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2d4f0 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32  ournal\000", 8+2
2d500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d510 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d520 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d530 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2d540 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d550 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2d560 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2d570 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d580 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2d590 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d5a0 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2d5b0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d5c0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2d5d0 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2d5e0 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2d5f0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2d600 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2d610 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d620 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2d630 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
2d640 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d650 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2d660 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2d670 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2d680 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2d690 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2d6a0 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2d6b0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2d6c0 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2d6d0 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2d6e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d6f0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2d700 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2d710 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2d720 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2d730 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2d740 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d750 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2d760 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2d770 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20  ert( !memDb );. 
2d780 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
2d790 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
2d7a0 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
2d7b0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
2d7c0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
2d7d0 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
2d7e0 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
2d7f0 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
2d800 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2d810 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
2d820 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
2d830 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2d840 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
2d850 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
2d860 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
2d870 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
2d880 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2d890 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
2d8a0 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
2d8b0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2d8c0 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
2d8d0 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
2d8e0 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
2d8f0 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
2d900 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
2d910 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2d920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d930 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b   && !readOnly ){
2d940 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72  .      setSector
2d950 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2d960 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2d970 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2d980 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
2d990 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2d9a0 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  E);.      if( sz
2d9b0 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d  PageDflt<pPager-
2d9c0 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20  >sectorSize ){. 
2d9d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2d9e0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51  r->sectorSize>SQ
2d9f0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2da00 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
2da10 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2da20 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
2da30 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2da40 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
2da50 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
2da60 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50  geDflt = (u32)pP
2da70 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2da80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2da90 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2daa0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2dab0 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20  WRITE.      {.  
2dac0 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
2dad0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2dae0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2daf0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2db00 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2db10 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2db20 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
2db30 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
2db40 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2db50 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2db60 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
2db70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2db80 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
2db90 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
2dba0 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66  5536);.        f
2dbb0 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
2dbc0 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
2dbd0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2dbe0 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
2dbf0 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2dc00 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2dc10 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2dc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2dc30 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
2dc40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
2dc60 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  if.    }.  }else
2dc70 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
2dc80 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2dc90 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
2dca0 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
2dcb0 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
2dcc0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
2dcd0 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
2dce0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
2dcf0 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
2dd00 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
2dd10 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
2dd20 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
2dd30 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
2dd40 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2dd50 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
2dd60 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
2dd70 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
2dd80 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
2dd90 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
2dda0 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
2ddb0 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
2ddc0 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
2ddd0 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
2dde0 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
2ddf0 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
2de00 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  nal..    */ .   
2de10 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
2de20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
2de30 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
2de40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c  ;.    pPager->eL
2de50 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ock = EXCLUSIVE_
2de60 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e  LOCK;.    readOn
2de70 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
2de80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2de90 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
2dea0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
2deb0 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
2dec0 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
2ded0 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
2dee0 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
2def0 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
2df00 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
2df10 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
2df20 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
2df30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2df40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2df50 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
2df60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2df70 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
2df80 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
2df90 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
2dfa0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
2dfb0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
2dfc0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2dfd0 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74   occurred in eit
2dfe0 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
2dff0 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
2e000 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74  e .  ** Pager st
2e010 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
2e020 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
2e030 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2e040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2e050 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d  rt( !pPager->pTm
2e060 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71  pSpace );.    sq
2e070 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2e080 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
2e090 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
2e0a0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
2e0b0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  c;.  }..  /* Ini
2e0c0 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2e0d0 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2e0e0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
2e0f0 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20  000 );.  nExtra 
2e100 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
2e110 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
2e120 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
2e130 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
2e140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e150 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
2e160 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
2e170 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
2e180 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
2e190 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
2e1a0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
2e1b0 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
2e1c0 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
2e1d0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
2e1e0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
2e1f0 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
2e200 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e210 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
2e220 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
2e230 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20  seJournal;.  /* 
2e240 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
2e250 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e260 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
2e270 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e280 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
2e290 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e2a0 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
2e2b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2e2c0 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
2e2d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
2e2e0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
2e2f0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
2e300 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
2e310 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
2e320 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
2e330 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a  NLOCK; */.#if 0.
2e340 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e350 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70  ->state == (temp
2e360 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43  File ? PAGER_EXC
2e370 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55  LUSIVE : PAGER_U
2e380 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66  NLOCK) );.#endif
2e390 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
2e3a0 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
2e3b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e3c0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2e3d0 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
2e3e0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2e3f0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
2e400 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
2e410 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2e420 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2e430 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
2e440 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2e450 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
2e460 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
2e470 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
2e480 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
2e490 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2e4a0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
2e4b0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2e4c0 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
2e4d0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
2e4e0 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
2e4f0 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
2e500 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
2e510 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e520 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
2e530 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
2e540 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  empFile;.  if( p
2e550 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2e560 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e570 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30  ger->fullSync==0
2e580 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e590 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2e5a0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  s==0 );.    asse
2e5b0 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  rt( pPager->walS
2e5c0 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2e5d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e5e0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2e5f0 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
2e600 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
2e610 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
2e620 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
2e630 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2e640 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
2e650 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
2e660 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2e670 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54  MAL | WAL_SYNC_T
2e680 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20  RANSACTIONS;.   
2e690 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2e6a0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2e6b0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
2e6c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
2e6d0 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
2e6e0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2e6f0 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
2e700 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
2e710 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
2e720 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
2e730 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
2e740 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
2e750 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
2e760 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
2e770 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
2e780 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2e790 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
2e7a0 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
2e7b0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2e7c0 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
2e7d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2e7e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2e7f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2e800 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
2e810 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
2e820 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2e830 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2e840 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
2e850 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
2e860 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
2e870 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e880 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
2e890 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2e8a0 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
2e8b0 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d  Reinit;.  /* mem
2e8c0 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
2e8d0 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
2e8e0 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
2e8f0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a  .  /* pPager->sz
2e900 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
2e910 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20  FAULT_MMAP_SIZE 
2e920 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62  // will be set b
2e930 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20  y btree.c */..  
2e940 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
2e950 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
2e960 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65  TE_OK;.}.../* Ve
2e970 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61  rify that the da
2e980 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
2e990 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f  not be deleted o
2e9a0 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72  r renamed out fr
2e9b0 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20  om.** under the 
2e9c0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53  pager.  Return S
2e9d0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
2e9e0 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69 6c  database is stil
2e9f0 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a  l were it ought.
2ea00 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b  ** to be on disk
2ea10 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
2ea20 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f  ro (SQLITE_READO
2ea30 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73  NLY_DBMOVED or s
2ea40 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  ome other error.
2ea50 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c  ** code from sql
2ea60 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29 20  ite3OsAccess()) 
2ea70 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2ea80 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67  has gone missing
2ea90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2eaa0 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
2eab0 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
2eac0 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65  {.  int bHasMove
2ead0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  d = 0;.  int rc;
2eae0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
2eaf0 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72  tempFile ) retur
2eb00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
2eb10 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2eb20 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
2eb30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
2eb40 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  t( pPager->zFile
2eb50 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e  name && pPager->
2eb60 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a  zFilename[0] );.
2eb70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2eb80 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
2eb90 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
2eba0 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20  CNTL_HAS_MOVED, 
2ebb0 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69  &bHasMoved);.  i
2ebc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
2ebd0 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a  TFOUND ){.    /*
2ebe0 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45   If the HAS_MOVE
2ebf0 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69  D file-control i
2ec00 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c  s unimplemented,
2ec10 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
2ec20 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73   file.    ** has
2ec30 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e   not been moved.
2ec40 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68 69    That is the hi
2ec50 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f  storical behavio
2ec60 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69  r of SQLite: pri
2ec70 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72  or to.    ** ver
2ec80 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e  sion 3.8.3, it n
2ec90 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a  ever checked */.
2eca0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ecb0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
2ecc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ecd0 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20   bHasMoved ){.  
2ece0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
2ecf0 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a  ADONLY_DBMOVED;.
2ed00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ed10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
2ed20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2ed30 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
2ed40 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
2ed50 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
2ed60 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
2ed70 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
2ed80 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2ed90 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
2eda0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
2edb0 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
2edc0 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
2edd0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
2ede0 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
2edf0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
2ee00 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
2ee10 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
2ee20 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
2ee30 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
2ee40 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2ee50 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
2ee60 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
2ee70 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
2ee80 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
2ee90 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
2eea0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2eeb0 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2eec0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2eed0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2eee0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
2eef0 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
2ef00 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
2ef10 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
2ef20 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
2ef30 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
2ef40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ef50 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
2ef60 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
2ef70 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
2ef80 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2ef90 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
2efa0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
2efb0 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
2efc0 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
2efd0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
2efe0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
2eff0 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
2f000 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
2f010 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2f020 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f030 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
2f040 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
2f050 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
2f060 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2f070 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2f080 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
2f090 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
2f0a0 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
2f0b0 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
2f0c0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
2f0d0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2f0e0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
2f0f0 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
2f100 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2f110 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
2f120 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
2f130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f140 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
2f150 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
2f160 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
2f170 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
2f180 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
2f190 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
2f1a0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
2f1b0 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
2f1c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2f1d0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2f1e0 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
2f1f0 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
2f200 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
2f210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f220 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
2f230 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2f240 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
2f250 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2f260 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
2f270 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2f280 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
2f290 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
2f2a0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2f2b0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2f2c0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2f2d0 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
2f2e0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
2f2f0 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
2f300 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2f310 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
2f320 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2f330 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2f340 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
2f350 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
2f360 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
2f370 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2f380 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
2f390 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
2f3a0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2f3b0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2f3c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2f3d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  _OK;           /
2f3e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2f3f0 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20  .  int exists = 
2f400 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2f410 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
2f420 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2f430 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  esent */.  int j
2f440 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70  rnlOpen = !!isOp
2f450 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2f460 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2f470 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2f480 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2f490 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2f4a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2f4b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2f4c0 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73  R_OPEN );..  ass
2f4d0 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30  ert( jrnlOpen==0
2f4e0 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44   || ( sqlite3OsD
2f4f0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2f500 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  tics(pPager->jfd
2f510 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49  ) &.    SQLITE_I
2f520 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
2f530 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b  _WHEN_OPEN.  ));
2f540 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
2f550 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65  ;.  if( !jrnlOpe
2f560 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
2f570 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
2f580 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2f590 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
2f5a0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
2f5b0 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sts);.  }.  if( 
2f5c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f5d0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
2f5e0 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20  nt locked = 0;  
2f5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f600 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
2f610 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
2f620 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20  VED lock */..   
2f630 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69   /* Race conditi
2f640 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65  on here:  Anothe
2f650 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
2f660 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e  have been holdin
2f670 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  g the.    ** the
2f680 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
2f690 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61  nd have a journa
2f6a0 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71  l open at the sq
2f6b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
2f6c0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
2f6d0 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c  ve, but then del
2f6e0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2f6f0 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63  and drop the loc
2f700 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  k before.    ** 
2f710 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f  we get to the fo
2f720 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f  llowing sqlite3O
2f730 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2f740 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74  ck() call.  If t
2f750 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  hat.    ** is th
2f760 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75  e case, this rou
2f770 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b  tine might think
2f780 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2f790 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20  journal when.   
2f7a0 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72   ** in fact ther
2f7b0 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73  e is none.  This
2f7c0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61   results in a fa
2f7d0 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69  lse-positive whi
2f7e0 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ch will.    ** b
2f7f0 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
2f800 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75  the playback rou
2f810 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33  tine.  Ticket #3
2f820 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  883..    */.    
2f830 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
2f840 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2f850 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
2f860 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
2f870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2f880 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
2f890 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2f8b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2f8c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2f8d0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  */..      /* Che
2f8e0 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
2f8f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f900 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
2f910 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
2f920 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
2f930 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2f940 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
2f950 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
2f960 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
2f970 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
2f980 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f  e.  Delete the o
2f990 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
2f9a0 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20  file under.     
2f9b0 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c   ** a RESERVED l
2f9c0 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63  ock to avoid rac
2f9d0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64  e conditions and
2f9e0 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74   to avoid violat
2f9f0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33  ing.      ** [H3
2fa00 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a  3020]..      */.
2fa10 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2fa20 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2fa30 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
2fa40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fa50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
2fa60 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
2fa70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2fa80 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
2fa90 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
2faa0 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  ( pagerLockDb(pP
2fab0 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
2fac0 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
2fad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2fae0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
2faf0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2fb00 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
2fb10 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2fb20 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2fb30 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  e ) pagerUnlockD
2fb40 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2fb50 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2fb60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2fb70 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
2fb80 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2fb90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2fba0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
2fbb0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2fbc0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
2fbd0 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
2fbe0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2fbf0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2fc00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2fc10 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
2fc20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
2fc30 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
2fc40 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
2fc50 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
2fc60 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2fc70 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
2fc80 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
2fc90 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
2fca0 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
2fcb0 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
2fcc0 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
2fcd0 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
2fce0 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
2fcf0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2fd00 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2fd10 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2fd20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2fd30 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
2fd40 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
2fd50 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2fd60 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2fd70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2fd80 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2fd90 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20  fd, f, &f);.    
2fda0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fdb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fdc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2fdd0 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
2fde0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2fdf0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2fe00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
2fe10 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
2fe20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2fe30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
2fe40 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
2fe50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2fe60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2fe70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2fe80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2fe90 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2fea0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2feb0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2fec0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
2fed0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2fee0 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72   *pExists = (fir
2fef0 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  st!=0);.        
2ff00 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2ff10 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2ff20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2ff30 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  * If we cannot o
2ff40 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  pen the rollback
2ff50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2ff60 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66   order to see if
2ff70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2ff80 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68  its has a zero h
2ff90 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68  eader, that migh
2ffa0 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49  t be due to an I
2ffb0 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20  /O error, or.   
2ffc0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d           ** it m
2ffd0 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74  ight be due to t
2ffe0 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
2fff0 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  n described abov
30000 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20  e and in.       
30010 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23       ** ticket #
30020 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61  3883.  Either wa
30030 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
30040 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
30050 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
30060 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  * This might be 
30070 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
30080 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c  .  But if it is,
30090 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
300a0 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
300b0 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62  ic journal playb
300c0 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79  ack and recovery
300d0 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20   mechanism will 
300e0 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  deal.           
300f0 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65   ** with it unde
30100 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
30110 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20  ock where we do 
30120 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  not need to.    
30130 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79          ** worry
30140 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61   so much with ra
30150 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20  ce conditions.. 
30160 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
30170 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
30180 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ts = 1;.        
30190 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
301a0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
301b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
301c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
301d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
301e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
301f0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
30200 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
30210 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30220 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
30230 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
30240 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
30250 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
30260 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
30270 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
30280 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
30290 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
302a0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
302b0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
302c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
302d0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
302e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
302f0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
30300 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
30310 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
30320 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
30330 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
30340 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
30350 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
30360 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
30370 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
30380 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
30390 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
303a0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
303b0 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
303c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
303d0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
303e0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
303f0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
30400 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
30410 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
30420 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
30430 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
30440 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
30450 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
30460 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
30470 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
30480 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
30490 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
304a0 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
304b0 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
304c0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
304d0 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
304e0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
304f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30500 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
30510 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
30520 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
30530 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
30540 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
30550 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
30560 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
30570 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
30580 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
30590 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
305a0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
305b0 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
305c0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
305d0 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
305e0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
305f0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
30600 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
30610 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
30620 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
30630 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
30640 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
30650 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
30660 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
30670 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
30680 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
30690 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
306a0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
306b0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
306c0 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
306d0 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
306e0 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
306f0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
30700 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
30710 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
30720 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
30730 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
30740 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
30750 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
30760 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
30770 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
30780 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
307a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
307b0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
307c0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
307d0 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
307e0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
307f0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
30800 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
30810 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
30820 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
30830 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
30840 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
30850 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
30860 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
30870 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
30880 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
30890 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
308a0 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mode..  */.  ass
308b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
308c0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
308d0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
308e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
308f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
30900 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
30910 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
30920 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
30930 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
30940 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
30950 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
30960 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
30970 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
30980 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
30990 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67  e; }..  if( !pag
309a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
309b0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
309c0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
309d0 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
309e0 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
309f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
30a00 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
30a10 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
30a20 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
30a30 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63  MEMDB );..    rc
30a40 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
30a50 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
30a60 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
30a70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30a80 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
30a90 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
30aa0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
30ab0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
30ac0 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
30ad0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
30ae0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
30af0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
30b00 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
30b10 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
30b20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
30b30 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
30b40 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
30b50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
30b60 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
30b70 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
30b80 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
30b90 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
30ba0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
30bb0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
30bc0 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
30bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30bf0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
30c00 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
30c10 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
30c20 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
30c30 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
30c40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30c50 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
30c60 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f  BACK;.        go
30c70 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
30c80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74   }..      /* Get
30c90 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
30ca0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30cb0 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
30cc0 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
30cd0 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
30ce0 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
30cf0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
30d00 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
30d10 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
30d20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
30d30 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
30d40 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
30d50 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
30d60 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
30d70 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
30d80 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
30d90 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
30da0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
30db0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
30dc0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
30dd0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
30de0 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20   rolling the .  
30df0 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
30e00 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  al back..      *
30e10 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  * .      ** Beca
30e20 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
30e30 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
30e40 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
30e50 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a  ted, any.      *
30e60 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
30e70 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63  attempting to ac
30e80 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
30e90 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20  e file will get 
30ea0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  to .      ** thi
30eb0 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
30ec0 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20  ode and fail to 
30ed0 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45  obtain its own E
30ee0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20  XCLUSIVE lock . 
30ef0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
30f00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
30f10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
30f20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
30f30 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d   is in locking_m
30f40 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
30f50 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a  de, the lock is.
30f60 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61        ** downgra
30f70 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f  ded to SHARED_LO
30f80 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  CK before this f
30f90 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
30fa0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30fb0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
30fc0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
30fd0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
30fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30ff0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
31000 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
31010 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  }. .      /* If 
31020 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
31030 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66  y open and the f
31040 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ile exists on di
31050 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20  sk, open the .  
31060 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
31070 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
31080 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65  cess. Write acce
31090 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ss is required b
310a0 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a  ecause .      **
310b0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
310c0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
310d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
310e0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
310f0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f  .      ** and po
31100 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
31110 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
31120 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72  ter on. Also, wr
31130 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20  ite-access .    
31140 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20    ** is usually 
31150 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61  required to fina
31160 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
31170 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   in journal_mode
31180 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20  =persist .      
31190 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73  ** mode (and als
311a0 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  o for journal_mo
311b0 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73  de=truncate on s
311c0 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20  ome systems)..  
311d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
311e0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
311f0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
31200 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  t usually means 
31210 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20  that some .     
31220 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
31230 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
31240 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
31250 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
31260 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
31270 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
31280 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
31290 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
312a0 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  it .      ** may
312b0 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
312c0 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20  ager was in the 
312d0 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
312e0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
312f0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
31300 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
31310 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
31320 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
31330 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
31340 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31350 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31360 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
31370 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
31380 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  fs;.        int 
31390 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20  bExists;        
313a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
313b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
313c0 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ists */.        
313d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
313e0 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
313f0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
31400 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
31410 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
31420 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20  &bExists);.     
31430 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31440 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20  E_OK && bExists 
31450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
31460 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
31470 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
31480 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
31490 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
314a0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
314b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
314c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
314d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
314e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
314f0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
31500 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
31510 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
31520 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31530 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
31540 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
31550 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
31560 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31570 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
31580 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
31590 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
315a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
315b0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
315c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
315d0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
315e0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
315f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31600 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31610 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
31620 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
31630 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
31640 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
31650 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
31660 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
31670 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
31680 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
31690 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
316a0 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
316b0 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
316c0 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
316d0 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
316e0 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
316f0 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
31700 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
31710 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
31720 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
31730 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
31740 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
31750 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
31760 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
31770 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
31780 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
31790 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
317a0 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
317b0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
317c0 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
317d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
317e0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
317f0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
31800 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
31810 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
31820 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
31830 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
31840 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
31850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31860 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31870 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
31880 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
31890 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
318a0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
318b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
318c0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
318d0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
318e0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  de ){.        pa
318f0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
31900 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
31910 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31920 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31940 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
31950 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f  taken if an erro
31960 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
31970 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20  rying to open.  
31980 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c        ** or roll
31990 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
319a0 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  nal while holdin
319b0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
319c0 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ock. The.       
319d0 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   ** pager_unlock
319e0 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
319f0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
31a00 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e   returning to un
31a10 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  lock.        ** 
31a20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
31a30 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20   unlock attempt 
31a40 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65  fails, then Page
31a50 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a  r.eLock must be.
31a60 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
31a70 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28  o UNKNOWN_LOCK (
31a80 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
31a90 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
31aa0 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  e for .        *
31ab0 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61  * UNKNOWN_LOCK a
31ac0 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c  bove for an expl
31ad0 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20  anation). .     
31ae0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31af0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   In order to get
31b00 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
31b10 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20  to do this, set 
31b20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a  Pager.eState to.
31b30 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52          ** PAGER
31b40 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73  _ERROR now. This
31b50 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
31b60 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72   counted as a tr
31b70 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  ansition.       
31b80 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61   ** to ERROR sta
31b90 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  te in the state 
31ba0 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74  diagram at the t
31bb0 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c  op of this file,
31bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63  .        ** sinc
31bd0 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  e we know that t
31be0 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20  he same call to 
31bf0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
31c00 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20  ill very.       
31c10 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e   ** shortly tran
31c20 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72  sition the pager
31c30 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f   object to the O
31c40 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69  PEN state. Calli
31c50 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ng.        ** as
31c60 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31c70 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f  () would fail no
31c80 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20  w, as it should 
31c90 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
31ca0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
31cb0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
31cc0 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a  when there are z
31cd0 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ero outstanding 
31ce0 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  page .        **
31cf0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20   references..   
31d00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31d10 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
31d20 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
31d30 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31d40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
31d50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
31d60 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31d70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31d80 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
31d90 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
31da0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
31db0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31dc0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  de && pPager->eL
31dd0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
31de0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
31df0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
31e00 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 28 0a  ->tempFile && (.
31e10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
31e20 70 42 61 63 6b 75 70 20 0a 20 20 20 20 20 7c 7c  pBackup .     ||
31e30 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
31e40 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
31e50 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20  pPCache)>0 .    
31e60 20 7c 7c 20 55 53 45 46 45 54 43 48 28 70 50 61   || USEFETCH(pPa
31e70 67 65 72 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  ger).    )){.   
31e80 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
31e90 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
31ea0 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
31eb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31ec0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
31ed0 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
31ee0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
31ef0 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
31f00 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65  ious.      ** re
31f10 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
31f20 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
31f30 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
31f40 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
31f50 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
31f60 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
31f70 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
31f80 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20  , flush the.    
31f90 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
31fa0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
31fb0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
31fc0 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
31fd0 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
31fe0 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
31ff0 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
32000 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
32010 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
32020 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
32030 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
32040 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
32050 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
32060 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
32070 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
32080 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
32090 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
320a0 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
320b0 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
320c0 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
320d0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
320e0 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
320f0 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
32100 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
32110 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
32120 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
32130 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
32140 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
32150 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
32160 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
32170 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
32180 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
32190 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f     */.      Pgno
321a0 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20   nPage = 0;.    
321b0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
321c0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
321d0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a  >dbFileVers)];..
321e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
321f0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
32200 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
32210 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
32220 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66  ailed;..      if
32230 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
32240 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
32250 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
32260 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
32270 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
32280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32290 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
322a0 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
322b0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
322c0 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
322d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
322e0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
322f0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
32300 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
32310 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
32330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
32340 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
32350 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
32360 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
32370 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
32380 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
32390 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
323a0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
323b0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
323c0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
323d0 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
323e0 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64    /* Unmap the d
323f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
32400 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
32410 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  t external proce
32420 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  sses.        ** 
32430 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74  may have truncat
32440 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
32450 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78  file and then ex
32460 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20  tended it back. 
32470 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73         ** to its
32480 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77   original size w
32490 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
324a0 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  s was not holdin
324b0 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  g a lock..      
324c0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
324d0 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73  e there may exis
324e0 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d  t a Pager.pMap m
324f0 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65  apping that appe
32500 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ars.        ** t
32510 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73  o be the right s
32520 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61  ize but is not a
32530 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41  ctually valid. A
32540 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20  void this.      
32550 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79    ** possibility
32560 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68   by unmapping th
32570 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20  e db here. */.  
32580 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54        if( USEFET
32590 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  CH(pPager) ){.  
325a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
325b0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
325c0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
325d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
325e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
325f0 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
32600 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
32610 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
32620 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
32630 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
32640 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
32650 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
32660 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
32670 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
32680 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
32690 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
326a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
326b0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
326c0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
326d0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
326e0 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
326f0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
32700 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
32710 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
32720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
32730 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
32740 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
32750 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
32760 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
32770 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
32780 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
32790 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
327a0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
327b0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  er, &pPager->dbS
327c0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ize);.  }.. fail
327d0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
327e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
327f0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
32800 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
32810 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  k(pPager);.    a
32820 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32830 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
32840 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  N );.  }else{.  
32850 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
32860 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
32870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
32880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
32890 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
328a0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
328b0 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
328c0 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
328d0 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
328e0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
328f0 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
32900 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
32910 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
32920 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
32930 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
32940 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
32950 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
32960 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
32970 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
32980 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
32990 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
329a0 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
329b0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
329c0 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
329d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
329e0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
329f0 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33  t==0 && (sqlite3
32a00 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
32a10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
32a20 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72  =0) ){.    pager
32a30 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
32a40 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
32a50 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
32a60 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
32a70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
32a80 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
32a90 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
32aa0 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
32ab0 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
32ac0 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
32ad0 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
32ae0 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
32af0 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
32b00 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
32b10 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
32b20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
32b30 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
32b40 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
32b50 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
32b60 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
32b70 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
32b80 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
32b90 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
32ba0 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
32bb0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
32bc0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
32bd0 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
32be0 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
32bf0 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
32c00 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
32c10 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
32c20 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
32c30 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
32c40 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
32c50 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
32c60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
32c70 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
32c80 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
32c90 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
32ca0 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
32cb0 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
32cc0 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
32cd0 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
32ce0 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
32cf0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
32d00 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
32d10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
32d20 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
32d30 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
32d40 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
32d50 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
32d60 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
32d70 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
32d80 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
32d90 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
32da0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
32db0 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
32dc0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
32dd0 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
32de0 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
32df0 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
32e00 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
32e10 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
32e20 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
32e30 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
32e40 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
32e50 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
32e60 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
32e70 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
32e80 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
32e90 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
32ea0 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
32eb0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
32ec0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
32ed0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
32ee0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
32ef0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
32f00 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
32f10 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
32f20 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
32f30 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
32f40 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
32f50 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
32f60 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
32f70 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
32f80 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
32f90 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
32fa0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
32fb0 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
32fc0 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
32fd0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
32fe0 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
32ff0 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
33000 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
33010 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
33020 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
33030 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
33040 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
33050 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
33060 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
33070 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
33080 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
33090 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
330a0 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
330b0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
330c0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
330d0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
330e0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
330f0 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
33100 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
33110 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
33120 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
33130 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
33140 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
33150 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
33160 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
33170 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
33180 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
33190 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
331a0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
331b0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
331c0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
331d0 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
331e0 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
331f0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
33200 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
33210 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
33220 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
33230 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
33240 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
33250 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
33260 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
33270 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
33280 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
33290 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
332a0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
332b0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
332c0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
332d0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
332e0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
332f0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33300 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
33310 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
33320 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
33330 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
33340 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
33350 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
33360 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
33370 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
33380 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
33390 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
333a0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
333b0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
333c0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
333d0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
333e0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
333f0 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
33400 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
33410 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
33420 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
33430 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
33440 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33450 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
33460 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
33470 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
33480 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
33490 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
334a0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
334b0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
334c0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
334d0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
334e0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
334f0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
33500 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
33510 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
33520 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
33530 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
33540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33550 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
33560 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
33570 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33580 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
33590 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
335a0 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ile */.  const i
335b0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  nt noContent = (
335c0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
335d0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  T_NOCONTENT);.. 
335e0 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
335f0 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
33600 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
33610 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
33620 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
33630 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
33640 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33650 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
33660 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
33670 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
33680 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
33690 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
336a0 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
336b0 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
336c0 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
336d0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
336e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
336f0 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d  MmapOk = (pgno!=
33700 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50  1 && USEFETCH(pP
33710 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61  ager).   && (pPa
33720 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33730 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
33740 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
33750 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65  READONLY)).#ifde
33760 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
33770 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  EC.   && pPager-
33780 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69  >xCodec==0.#endi
33790 66 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  f.  );..  assert
337a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
337b0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
337c0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
337d0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
337e0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
337f0 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  rt( noContent==0
33800 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29   || bMmapOk==0 )
33810 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
33820 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33830 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
33840 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
33850 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
33860 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
33870 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
33880 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
33890 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
338a0 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
338b0 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
338c0 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
338d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
338e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
338f0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
33900 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
33910 7b 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70  {..    if( bMmap
33920 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61  Ok && pagerUseWa
33930 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
33940 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
33950 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
33960 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20  er->pWal, pgno, 
33970 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20  &iFrame);.      
33980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33990 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
339a0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
339b0 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70  }..    if( bMmap
339c0 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20  Ok && iFrame==0 
339d0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
339e0 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Data = 0;..     
339f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
33a00 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
33a10 20 0a 20 20 20 20 20 20 20 20 20 20 28 69 36 34   .          (i64
33a20 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
33a30 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
33a40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
33a50 26 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a  &pData.      );.
33a60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
33a70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
33a80 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  a ){.        if(
33a90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33aa0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a  PAGER_READER ){.
33ab0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
33ac0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
33ad0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
33ae0 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
33af0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
33b00 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
33b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
33b20 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 4d   = pagerAcquireM
33b30 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  apPage(pPager, p
33b40 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67  gno, pData, &pPg
33b50 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
33b60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
33b70 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
33b80 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
33b90 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
33ba0 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
33bb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33bc0 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
33bd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33be0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
33bf0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61  .          *ppPa
33c00 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ge = pPg;.      
33c10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33c20 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
33c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33c40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33c50 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
33c60 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
33c70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
33c80 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
33c90 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
33ca0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
33cb0 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
33cc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
33cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33ce0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
33cf0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
33d00 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
33d10 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
33d20 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
33d30 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
33d40 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
33d50 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
33d60 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
33d70 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
33d80 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
33d90 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
33da0 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
33db0 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
33dc0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
33dd0 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
33de0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
33df0 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
33e00 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
33e10 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
33e20 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
33e30 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
33e40 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
33e50 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
33e60 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
33e70 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
33e80 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
33e90 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
33ea0 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
33eb0 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
33ec0 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
33ed0 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
33ee0 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
33ef0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
33f00 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
33f10 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
33f20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
33f30 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
33f40 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
33f50 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
33f60 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
33f70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
33f80 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
33f90 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
33fa0 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
33fb0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
33fc0 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a   */..    pPg = *
33fd0 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
33fe0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
33ff0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
34000 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
34010 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
34020 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34030 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
34040 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
34050 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
34060 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
34070 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
34080 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
34090 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
340a0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
340b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
340c0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
340d0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
340e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
340f0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34100 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34110 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
34120 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
34130 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
34140 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
34150 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
34160 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
34170 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
34180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
34190 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
341a0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
341b0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
341c0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
341d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
341e0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
341f0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
34200 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
34210 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
34220 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
34230 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
34240 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
34250 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
34260 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
34270 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
34280 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
34290 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
342a0 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
342b0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
342c0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
342d0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
342e0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
342f0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
34300 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
34310 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
34320 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34330 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
34340 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
34350 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
34360 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
34370 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
34380 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
34390 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
343a0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
343b0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
343c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
343d0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
343e0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
343f0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
34400 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
34410 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
34420 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
34430 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34450 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
34460 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
34470 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
34480 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
34490 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
344a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
344b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
344c0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
344d0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
344e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
344f0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
34500 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f  Pager) && bMmapO
34510 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
34520 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
34530 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
34540 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
34550 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  rame);.        i
34560 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34570 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
34580 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34590 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
345a0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
345b0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
345c0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
345d0 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
345e0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
345f0 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
34600 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34610 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34620 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
34630 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34640 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
34650 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
34660 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ash(pPg);.  }.. 
34670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34680 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
34690 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
346a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
346b0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
346c0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
346d0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
346e0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
346f0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
34700 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
34710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34720 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
34730 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
34740 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
34750 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
34760 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
34770 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
34780 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
34790 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
347a0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
347b0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
347c0 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  he. .**.** See a
347d0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
347e0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
347f0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
34800 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
34810 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
34820 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
34830 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
34840 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
34850 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
34860 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
34870 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
34880 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
34890 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
348a0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
348b0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
348c0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
348d0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
348e0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
348f0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
34900 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
34910 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
34920 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
34930 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
34940 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
34950 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
34960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34970 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
34980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34990 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
349a0 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
349b0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
349c0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73  GER_ERROR );.  s
349d0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
349e0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
349f0 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
34a00 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  );.  return pPg;
34a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
34a20 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
34a30 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ce..**.** If the
34a40 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
34a50 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
34a60 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
34a70 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
34a80 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
34a90 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
34aa0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
34ab0 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
34ac0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
34ad0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
34ae0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
34af0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
34b00 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  ** removed..*/.v
34b10 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
34b20 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50  UnrefNotNull(DbP
34b30 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
34b40 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73  er *pPager;.  as
34b50 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a  sert( pPg!=0 );.
34b60 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
34b70 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
34b80 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
34b90 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67  _MMAP ){.    pag
34ba0 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
34bb0 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (pPg);.  }else{.
34bc0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
34bd0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
34be0 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
34bf0 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
34c00 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
34c10 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
34c20 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
34c30 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  Pg ) sqlite3Page
34c40 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
34c50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  g);.}../*.** Thi
34c60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
34c70 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
34c80 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
34c90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
34ca0 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
34cb0 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
34cc0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
34cd0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
34ce0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
34cf0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
34d00 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
34d10 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
34d20 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
34d30 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
34d40 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
34d50 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
34d60 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
34d70 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
34d80 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
34d90 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
34da0 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
34db0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
34dc0 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
34dd0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
34de0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
34df0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
34e00 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
34e10 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
34e20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
34e30 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
34e40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
34e50 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
34e60 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
34e70 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
34e80 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
34e90 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
34ea0 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
34eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
34ec0 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
34ed0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
34ee0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
34ef0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
34f00 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
34f10 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
34f20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
34f30 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
34f40 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
34f50 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
34f60 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
34f70 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
34f80 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
34f90 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
34fa0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
34fb0 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
34fc0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
34fd0 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
34fe0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
34ff0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
35000 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
35010 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
35020 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
35030 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
35040 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
35050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
35060 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
35070 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
35080 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
35090 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
350a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
350b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
350c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
350d0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
350e0 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
350f0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
35100 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
35110 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35120 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35130 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
35140 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
35150 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
35160 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
35170 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
35180 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
35190 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
351a0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
351b0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
351c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
351d0 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
351e0 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
351f0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
35200 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
35210 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
35220 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
35230 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
35240 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
35250 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
35260 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66  ->errCode;..  if
35270 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
35280 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
35290 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
352a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
352b0 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67  _OFF ){.    pPag
352c0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
352d0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
352e0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
352f0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
35300 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
35320 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
35330 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
35340 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
35350 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
35360 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
35370 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  n. */.    if( !i
35380 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
35390 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
353a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
353b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
353c0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
353d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
353e0 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
353f0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
35400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35410 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
35420 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
35430 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
35440 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
35450 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
35460 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
35470 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
35480 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
35490 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
354a0 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
354b0 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
354c0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
354d0 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
354e0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
354f0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
35500 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
35510 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20  URNAL).         
35520 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   );..        /* 
35530 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
35540 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68  database still h
35550 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
35560 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a   as it did when.
35570 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61          ** it wa
35580 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  s originally ope
35590 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ned. */.        
355a0 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73 55  rc = databaseIsU
355b0 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a  nmoved(pPager);.
355c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
355d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
355e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
355f0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
35600 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
35610 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
35620 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
35630 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
35640 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
35650 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
35660 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
35670 72 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  r).          );.
35680 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
35690 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
356a0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
356b0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
356c0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
356d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
356e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
356f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
35700 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
35710 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
35720 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
35730 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
35740 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
35750 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
35760 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
35770 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
35780 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
35790 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
357a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
357b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
357c0 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
357d0 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
357e0 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
357f0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
35800 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
35810 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
35820 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
35830 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
35840 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
35850 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
35860 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
35870 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
35880 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
35890 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
358a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
358b0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
358c0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
358d0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
358e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
358f0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
35900 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35910 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35920 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
35930 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
35940 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
35950 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
35960 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
35970 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
35980 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
35990 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
359a0 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
359b0 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
359c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
359d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
359e0 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
359f0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
35a00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
35a10 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
35a20 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
35a30 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
35a40 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
35a50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
35a60 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
35a70 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
35a80 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
35a90 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
35aa0 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
35ab0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
35ac0 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
35ad0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
35ae0 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
35af0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
35b00 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
35b10 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
35b20 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
35b30 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
35b40 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
35b50 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
35b60 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
35b70 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
35b80 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
35b90 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
35ba0 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
35bb0 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
35bc0 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
35bd0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
35be0 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
35bf0 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
35c00 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
35c10 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
35c20 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
35c30 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
35c40 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
35c50 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
35c60 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
35c70 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
35c80 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
35c90 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
35ca0 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
35cb0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
35cc0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
35cd0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
35ce0 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
35cf0 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
35d00 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
35d10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
35d20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
35d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
35d40 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
35d50 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
35d60 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
35d70 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
35d80 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
35d90 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
35da0 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
35db0 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
35dc0 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
35dd0 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
35de0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35df0 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
35e00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
35e10 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
35e20 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
35e30 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
35e40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
35e50 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
35e60 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
35e70 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
35e80 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
35e90 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
35ea0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
35eb0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
35ec0 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
35ed0 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
35ee0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
35ef0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
35f00 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
35f10 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
35f20 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
35f30 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
35f40 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
35f50 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
35f60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
35f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35f80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
35f90 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
35fa0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45       sqlite3WalE
35fb0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
35fc0 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
35fd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
35fe0 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
35ff0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
36000 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
36010 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
36020 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
36030 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
36040 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
36050 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
36060 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
36070 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
36080 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
36090 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
360a0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
360b0 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
360c0 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
360d0 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
360e0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
360f0 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20   will call it.. 
36100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
36110 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
36120 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
36130 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
36140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36150 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
36160 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
36170 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36180 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
36190 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
361a0 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
361b0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
361c0 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
361d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
361e0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
361f0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
36200 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
36210 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
36220 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
36230 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
36240 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
36250 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
36260 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
36270 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
36280 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
36290 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
362a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
362b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c  QLITE_OK && exFl
362c0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
362d0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
362e0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
362f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
36300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
36310 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36320 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
36330 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52  Change to WRITER
36340 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20  _LOCKED state.. 
36350 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
36360 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50   WAL mode sets P
36370 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50  ager.eState to P
36380 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
36390 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20  ED or CACHEMOD. 
363a0 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20       ** when it 
363b0 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  has an open tran
363c0 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
363d0 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46  er to DBMOD or F
363e0 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a  INISHED..      *
363f0 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
36400 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65  e in those state
36410 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  s the code to ro
36420 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  ll back savepoin
36430 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
36440 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70  sactions may cop
36450 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  y data from the 
36460 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f  sub-journal into
36470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
36480 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
36490 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65  well as into the
364a0 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
364b0 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
364c0 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20  rrect in .      
364d0 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20  ** WAL mode..   
364e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
364f0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
36500 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36510 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36520 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
36530 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
36540 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
36550 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
36560 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
36570 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
36580 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
36590 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
365a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
365b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
365c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
365d0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
365e0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
365f0 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
36600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
36610 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36620 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
36630 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73  OCKED );.    ass
36640 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
36650 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
36660 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
36670 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
36680 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
36690 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72  D(pPager)));.  r
366a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
366b0 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
366c0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
366d0 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
366e0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
366f0 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
36700 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
36710 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
36720 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
36730 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
36740 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
36750 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
36760 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
36770 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
36780 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
36790 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
367a0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
367b0 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
367c0 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
367d0 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
367e0 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
367f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
36800 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
36810 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
36820 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
36830 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
36840 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
36850 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36860 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
36870 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
36880 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77  alled unless a w
36890 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
368a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20   has already .  
368b0 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  ** been started.
368c0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
368d0 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  e may or may not
368e0 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73   be open at this
368f0 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20   point..  ** It 
36900 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
36910 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
36920 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
36930 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36940 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36950 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
36960 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36970 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
36980 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
36990 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
369a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
369b0 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
369c0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
369d0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
369e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
369f0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b  r->errCode==0 );
36a00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36a10 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  r->readOnly==0 )
36a20 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
36a30 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  pPg);..  /* The 
36a40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
36a50 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e  ds to be opened.
36a60 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
36a70 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65  utines have alre
36a80 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65  ady.  ** obtaine
36a90 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
36aa0 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74  locks to begin t
36ab0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
36ac0 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20  tion, but the.  
36ad0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
36ae0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
36af0 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20  t be open. Open 
36b00 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69  it now if this i
36b10 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a  s the case..  **
36b20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f  .  ** This is do
36b30 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ne before callin
36b40 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  g sqlite3PcacheM
36b50 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68  akeDirty() on th
36b60 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74  e page. .  ** Ot
36b70 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77  herwise, if it w
36b80 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63  ere done after c
36b90 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63  alling sqlite3Pc
36ba0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c  acheMakeDirty(),
36bb0 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72   then.  ** an er
36bc0 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20  ror might occur 
36bd0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f  and the pager wo
36be0 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52  uld end up in WR
36bf0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
36c00 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65  e.  ** with page
36c10 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
36c20 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  y in the cache..
36c30 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
36c40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36c50 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
36c60 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
36c70 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
36c80 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
36c90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
36ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
36cb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36cc0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
36cd0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
36ce0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
36cf0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
36d00 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ager) );..  /* M
36d10 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
36d20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
36d30 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
36d40 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
36d50 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
36d60 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
36d70 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
36d80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
36d90 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
36da0 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
36db0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
36dc0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
36dd0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73  e(pPg) ){.    as
36de0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
36df0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
36e00 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
36e10 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
36e20 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
36e30 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
36e40 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
36e50 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
36e60 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
36e70 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
36e80 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
36e90 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
36ea0 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
36eb0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
36ec0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
36ed0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
36ee0 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
36ef0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70  urnal(pPg) && !p
36f00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
36f10 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r) ){.      asse
36f20 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
36f30 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
36f40 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
36f50 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
36f60 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28  gSize && isOpen(
36f70 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
36f80 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
36f90 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
36fa0 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20  *pData2;.       
36fb0 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
36fc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
36fd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
36fe0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
36ff0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
37000 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
37010 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
37020 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
37030 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
37040 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
37050 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
37060 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
37070 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
37080 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
37090 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
370a0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  O(pPager) );..  
370b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
370c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
370d0 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
370e0 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20  lOff );.        
370f0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
37100 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
37110 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
37120 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
37130 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
37140 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
37150 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
37160 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  2);..        /* 
37170 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
37180 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
37190 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
371a0 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
371b0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
371c0 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
371d0 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
371e0 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
371f0 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
37200 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
37210 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
37220 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
37230 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
37240 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
37250 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
37260 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
37270 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
37280 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
37290 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
372a0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
372b0 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
372c0 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
372d0 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
372e0 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
372f0 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
37300 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
37310 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
37320 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a  HDR_NEED_SYNC;..
37330 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
37340 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
37350 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
37360 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
37370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37380 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
37390 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
373a0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
373b0 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
373c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
373d0 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20  , iOff+4);.     
373e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
373f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
37400 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
37410 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
37420 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61  r->jfd, iOff+pPa
37430 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
37440 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
37450 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37460 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37470 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
37480 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
37490 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
374a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
374b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
374c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
374d0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
374e0 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
374f0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
37500 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
37510 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
37520 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
37530 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
37540 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
37550 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
37560 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
37570 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
37580 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
37590 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
375a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
375b0 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
375c0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
375d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
375e0 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70  rnalOff += 8 + p
375f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
37600 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
37610 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
37620 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37630 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
37640 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
37650 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
37660 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37670 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
37680 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
37690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
376a0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EM );.        as
376b0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
376c0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
376d0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
376e0 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61     rc |= addToSa
376f0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
37700 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
37710 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
37720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37730 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
37740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
37750 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EM );.          
37760 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
37770 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
37780 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
37790 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
377a0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
377b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
377c0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
377d0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
377e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
377f0 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45  AGERTRACE(("APPE
37800 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
37810 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
37820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
37830 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
37840 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
37850 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
37860 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
37870 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20  _SYNC)?1:0)));. 
37880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
37890 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
378a0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
378b0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
378c0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
378d0 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
378e0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
378f0 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
37900 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
37910 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
37920 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
37930 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
37940 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
37950 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
37960 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
37970 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
37980 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
37990 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
379a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62    */.    if( sub
379b0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
379c0 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  g) ){.      rc =
379d0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
379e0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
379f0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
37a00 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
37a10 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
37a20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
37a30 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
37a40 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
37a50 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
37a60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37a70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
37a80 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
37a90 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20  writeable. This 
37aa0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
37ab0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a  called before .*
37ac0 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  * making changes
37ad0 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20   to a page. The 
37ae0 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63  caller must chec
37af0 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  k the return val
37b00 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66  ue .** of this f
37b10 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63  unction and be c
37b20 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68  areful not to ch
37b30 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
37b40 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68  ta unless .** th
37b50 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
37b60 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
37b70 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
37b80 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
37b90 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
37ba0 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
37bb0 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
37bc0 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
37bd0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
37be0 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
37bf0 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
37c00 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
37c10 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
37c20 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
37c30 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
37c40 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
37c50 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
37c60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
37c70 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
37c80 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
37c90 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e  occurs, SQLITE_N
37ca0 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
37cb0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
37cc0 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f  rned.** as appro
37cd0 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73  priate. Otherwis
37ce0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
37cf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37d00 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
37d10 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
37d20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
37d30 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
37d40 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
37d50 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
37d60 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Pager;..  assert
37d70 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ( (pPg->flags & 
37d80 50 47 48 44 52 5f 4d 4d 41 50 29 3d 3d 30 20 29  PGHDR_MMAP)==0 )
37d90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37da0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
37db0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37dd0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
37de0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
37df0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
37e00 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
37e10 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
37e20 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3e 20  r->sectorSize > 
37e30 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
37e40 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 50 67 6e  eSize ){.    Pgn
37e50 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
37e60 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
37e70 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
37e80 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
37e90 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
37ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37eb0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
37ec0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
37ed0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
37ee0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
37ef0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
37f00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
37f10 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
37f20 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
37f30 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
37f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f50 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
37f60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
37f70 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
37f80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
37f90 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
37fa0 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 20 20 20  NEED_SYNC */.   
37fb0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
37fc0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
37fd0 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
37fe0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
37ff0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
38000 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20  NotSpill NOSYNC 
38010 62 69 74 20 74 6f 20 31 2e 20 54 68 69 73 20 69  bit to 1. This i
38020 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
38030 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a  not allow.    **
38040 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
38050 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
38060 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
38070 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20  s journaled by. 
38080 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
38090 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
380a0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
380b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
380c0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
380d0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
380e0 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
380f0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
38100 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
38110 4e 4f 53 59 4e 43 3b 0a 0a 20 20 20 20 2f 2a 20  NOSYNC;..    /* 
38120 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
38130 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
38140 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
38150 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
38160 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
38170 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
38180 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
38190 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
381a0 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
381b0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
381c0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
381d0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
381e0 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
381f0 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
38200 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
38210 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
38220 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67  PageCount = pPag
38230 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
38240 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
38250 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
38260 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
38270 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
38280 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
38290 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
382a0 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
382b0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
382c0 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
382d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
382e0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
382f0 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
38300 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
38310 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
38320 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
38330 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
38340 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
38350 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
38360 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
38370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
38380 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
38390 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
383a0 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
383b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
383c0 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
383d0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
383e0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
383f0 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
38400 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
38410 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
38420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
38430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
38440 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
38450 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
38460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
38470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
38480 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
38490 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
384a0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
384b0 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
384c0 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
384d0 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
384e0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
384f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
38500 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
38510 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
38520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
38530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
38540 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
38550 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
38560 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
38570 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
38580 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
38590 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
385a0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
385b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
385c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
385d0 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
385e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
385f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
38600 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  f the PGHDR_NEED
38610 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65  _SYNC flag is se
38620 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
38630 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
38640 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
38650 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
38660 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
38670 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
38680 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
38690 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
386a0 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
386b0 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
386c0