/ Hex Artifact Content
Login

Artifact 122d1e3e79424166d27a3a2768260bc613ac5acf99ea523f6127292636a589ed:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 2c 20 77   hits, misses, w
8630: 72 69 74 65 73 2c 20 73 70 69 6c 6c 73 20 2a 2f  rites, spills */
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8650: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
8680: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
8690: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
86a0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
86b0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
86c0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
86d0: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
86e0: 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65  int (*xGet)(Page
86f0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
8700: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8710: 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74  e to fetch a pat
8720: 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ch */.#ifdef SQL
8730: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
8740: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
8750: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
8760: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8770: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
8780: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
8790: 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
87a0: 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
87b0: 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20  ); /* Notify of 
87c0: 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65  page size change
87d0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
87e0: 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
87f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8800: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
8810: 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76  the codec */.  v
8820: 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20  oid *pCodec;    
8830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8840: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
8850: 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64  xCodec... method
8860: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  s */.#endif.  ch
8870: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
8880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8890: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
88a0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
88b0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63  mp use */.  PCac
88c0: 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20  he *pPCache;    
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88e0: 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65  er to page cache
88f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64   object */.#ifnd
8900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
8910: 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20  AL.  Wal *pWal; 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20   /* Write-ahead 
8940: 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  log used by "jou
8950: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
8960: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72  /* File name for
8990: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
89a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
89b0: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89c0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89d0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89e0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89f0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
8a00: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
8a10: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a20: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a30: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a40: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a50: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a60: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a70: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a80: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a90: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8aa0: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8ab0: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8ac0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ad0: 54 41 54 5f 53 50 49 4c 4c 20 33 0a 0a 2f 2a 0a  TAT_SPILL 3../*.
8ae0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8af0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8b00: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8b10: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b20: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b30: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b40: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b50: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b60: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b70: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b80: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b90: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8ba0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8bb0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8bc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8be0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8c10: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c30: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c40: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c50: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c90: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8ca0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8cb0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8cc0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cd0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8ce0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cf0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8d00: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8d10: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d20: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d30: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d40: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d50: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d60: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d70: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8da0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8db0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8dc0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8dd0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8df0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8e00: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8e10: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e20: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e40: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e50: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e60: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e70: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8ea0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8eb0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ec0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8ed0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ee0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ef0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8f00: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8f10: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f30: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f40: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f50: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f60: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f70: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f80: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f90: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8fa0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8fb0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fc0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fe0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8ff0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
9000: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
9010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9020: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9030: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9040: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9050: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9060: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9070: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9080: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9090: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
90a0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
90b0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90d0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90e0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90f0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
9100: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
9110: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9120: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9130: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9140: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9150: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9160: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9170: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9180: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9190: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
91a0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
91b0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91c0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91d0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91e0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
9200: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
9210: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9220: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9230: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9240: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9260: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9270: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9290: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
92a0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
92b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
9300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
9310: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9320: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9330: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9340: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9350: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9360: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9370: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9380: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9390: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
93a0: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
93b0: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93c0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93f0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
9400: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
9410: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9420: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9430: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9440: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9450: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9460: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9470: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9480: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9490: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
94a0: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
94b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94d0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94f0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9520: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9530: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9540: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9550: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9560: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9570: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9580: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9590: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
95a0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
95b0: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95c0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95d0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95e0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95f0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
9600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
9610: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9620: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9630: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9640: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9650: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9660: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9670: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9690: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
96a0: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
96b0: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96c0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96d0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96e0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96f0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
9700: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
9710: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9720: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9730: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9740: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9750: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9760: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9770: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9780: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9790: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
97a0: 68 6f 64 73 21 3d 30 29 0a 0a 23 69 66 64 65 66  hods!=0)..#ifdef
97b0: 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
97c0: 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 2f 2a 0a  VERFLOW_READ./*.
97d0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
97e0: 66 20 70 61 67 65 20 70 67 6e 6f 20 63 61 6e 20  f page pgno can 
97f0: 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
9800: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
9810: 73 65 20 66 69 6c 65 0a 2a 2a 20 62 79 20 74 68  se file.** by th
9820: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2e 20  e b-tree layer. 
9830: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  This is the case
9840: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   if:.**.**   * t
9850: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9860: 20 69 73 20 6f 70 65 6e 2c 0a 2a 2a 20 20 20 2a   is open,.**   *
9870: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69   there are no di
9880: 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
9890: 20 63 61 63 68 65 2c 20 61 6e 64 0a 2a 2a 20 20   cache, and.**  
98a0: 20 2a 20 74 68 65 20 64 65 73 69 72 65 64 20 70   * the desired p
98b0: 61 67 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  age is not curre
98c0: 6e 74 6c 79 20 69 6e 20 74 68 65 20 77 61 6c 20  ntly in the wal 
98d0: 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  file..*/.int sql
98e0: 69 74 65 33 50 61 67 65 72 44 69 72 65 63 74 52  ite3PagerDirectR
98f0: 65 61 64 4f 6b 28 50 61 67 65 72 20 2a 70 50 61  eadOk(Pager *pPa
9900: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
9910: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
9920: 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 29  d->pMethods==0 )
9930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
9940: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 49 73   sqlite3PCacheIs
9950: 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
9960: 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 20  Cache) ) return 
9970: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
9980: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
9990: 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 21   pPager->xCodec!
99a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  =0 ) return 0;.#
99b0: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
99c0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
99d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
99e0: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 52 65 61   ){.    u32 iRea
99f0: 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  d = 0;.    int r
9a00: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
9a10: 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
9a20: 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
9a30: 6e 6f 2c 20 26 69 52 65 61 64 29 3b 0a 20 20 20  no, &iRead);.   
9a40: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
9a50: 49 54 45 5f 4f 4b 20 26 26 20 69 52 65 61 64 3d  ITE_OK && iRead=
9a60: 3d 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  =0);.  }.#endif.
9a70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
9a80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
9a90: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 20  LITE_OMIT_WAL.# 
9aa0: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9ab0: 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61 6c  al(x) ((x)->pWal
9ac0: 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0).#else.# def
9ad0: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
9ae0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
9af0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
9b00: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9b10: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
9b20: 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20  x,y) 0.# define 
9b30: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9b40: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9b50: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9b60: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
9b70: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
9b80: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
9b90: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
9ba0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
9bb0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
9bc0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
9bd0: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
9be0: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
9bf0: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
9c00: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9c10: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9c20: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9c30: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9c40: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9c50: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9c60: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
9c70: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
9c80: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
9c90: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
9ca0: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
9cb0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
9cc0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
9cd0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9ce0: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
9cf0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9d00: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9d10: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9d20: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9d30: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9d40: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9d50: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9d60: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
9d70: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9d80: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
9d90: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9da0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
9db0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
9dc0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
9dd0: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
9de0: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
9df0: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
9e00: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9e10: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9e20: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9e30: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9e40: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9e50: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9e60: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
9e70: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
9e80: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
9e90: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
9ea0: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
9eb0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
9ec0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
9ed0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9ee0: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
9ef0: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
9f00: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9f10: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9f20: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9f30: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9f40: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9f50: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9f60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9f70: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
9f80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
9f90: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
9fa0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9fb0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9fc0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9fd0: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
9fe0: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
9ff0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
a000: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
a010: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
a020: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
a030: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
a040: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
a050: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
a060: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
a070: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
a080: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
a090: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
a0a0: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
a0b0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
a0c0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
a0d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
a0e0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
a0f0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
a100: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
a110: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
a120: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
a130: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
a140: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
a150: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
a160: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a170: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
a180: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a190: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
a1a0: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
a1b0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
a1c0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
a1d0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
a1e0: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
a1f0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
a200: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
a210: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
a220: 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a  sOpen(p->fd) );.
a230: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
a240: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
a250: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
a260: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a270: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a280: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a290: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a2a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
a2b0: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
a2c0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
a2d0: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
a2e0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
a2f0: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
a300: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
a310: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
a320: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
a330: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
a340: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
a350: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
a360: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
a370: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
a380: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
a390: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
a3a0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
a3b0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a3c0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
a3d0: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
a3e0: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
a3f0: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
a400: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a410: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
a420: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
a430: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a440: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a450: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a460: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a470: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a480: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
a490: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
a4a0: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
a4b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a4c0: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
a4d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a4e0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a4f0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a500: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a510: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a520: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a530: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
a540: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
a550: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a560: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
a570: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
a580: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a590: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a5a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a5b0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a5c0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a5d0: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a5e0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a5f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a600: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a610: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
a620: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a630: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
a640: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
a650: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a660: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a670: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a680: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a690: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a6a0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a6b0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a6c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a6d0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a6e0: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a6f0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a700: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a710: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a720: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a730: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a740: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a750: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a760: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a770: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a780: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a790: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a7a0: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a7b0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a7c0: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a7d0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a7e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a7f0: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a800: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a810: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a820: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a830: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a840: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a850: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a860: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a870: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a880: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a890: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a8a0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a8b0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a8c0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a8d0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a8e0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a8f0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a900: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a910: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a920: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a930: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a940: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a950: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a960: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a970: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a980: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a990: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a9a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a9b0: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a9c0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a9d0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a9e0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a9f0: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
aa00: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
aa10: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
aa20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
aa30: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
aa40: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
aa50: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
aa60: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
aa70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
aa80: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
aa90: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
aaa0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
aab0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
aac0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
aad0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aae0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
aaf0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
ab00: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ab10: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
ab20: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
ab30: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
ab40: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ab50: 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  p->fd)&SQLITE_IO
ab60: 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
ab70: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
ab80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ab90: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
aba0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
abb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
abc0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
abd0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
abe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
abf0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
ac00: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
ac10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ac20: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
ac30: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
ac40: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
ac50: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
ac60: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
ac70: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
ac80: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
ac90: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aca0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
acb0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
acc0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
acd0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ace0: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20  WAL .           
acf0: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
ad00: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
ad10: 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45  cs(p->fd)&SQLITE
ad20: 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f  _IOCAP_BATCH_ATO
ad30: 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  MIC).      );.  
ad40: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
ad50: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
ad60: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
ad70: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
ad80: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
ad90: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
ada0: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
adb0: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
adc0: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
add0: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
ade0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
adf0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
ae00: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
ae10: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ae20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ae30: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
ae40: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
ae50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
ae60: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
ae70: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c  r->pPCache)>0 ||
ae80: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
ae90: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
aea0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
aeb0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  1;.}.#endif /* i
aec0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a  fndef NDEBUG */.
aed0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aee0: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75  EBUG ./*.** Retu
aef0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
af00: 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
af10: 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61   string in a sta
af20: 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f  tic buffer.** co
af30: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61  ntaining the sta
af40: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
af50: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
af60: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68   an argument. Th
af70: 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65  is.** is intende
af80: 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  d to be used wit
af90: 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46  hin debuggers. F
afa0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61  or example, as a
afb0: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  n alternative.**
afc0: 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67   to "print *pPag
afd0: 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a  er" in gdb:.**.*
afe0: 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22  * (gdb) printf "
aff0: 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72  %s", print_pager
b000: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a  _state(pPager).*
b010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b020: 65 20 68 61 73 20 65 78 74 65 72 6e 61 6c 20 6c  e has external l
b030: 69 6e 6b 61 67 65 20 69 6e 20 6f 72 64 65 72 20  inkage in order 
b040: 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d 70  to suppress comp
b050: 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 0a 2a 2a  iler warnings.**
b060: 20 61 62 6f 75 74 20 61 6e 20 75 6e 75 73 65 64   about an unused
b070: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 69   function.  It i
b080: 73 20 65 6e 63 6c 6f 73 65 64 20 77 69 74 68 69  s enclosed withi
b090: 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  n SQLITE_DEBUG a
b0a0: 6e 64 20 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e 6f  nd so does.** no
b0b0: 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d  t appear in norm
b0c0: 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63 68  al builds..*/.ch
b0d0: 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f  ar *print_pager_
b0e0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
b0f0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
b100: 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71  Ret[1024];..  sq
b110: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
b120: 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20  024, zRet,.     
b130: 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20   "Filename:     
b140: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74   %s\n".      "St
b150: 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20  ate:         %s 
b160: 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20  errCode=%d\n".  
b170: 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20      "Lock:      
b180: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
b190: 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20  "Locking mode:  
b1a0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c  locking_mode=%s\
b1b0: 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61  n".      "Journa
b1c0: 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c  l mode:  journal
b1d0: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
b1e0: 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65    "Backing store
b1f0: 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65  : tempFile=%d me
b200: 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61  mDb=%d useJourna
b210: 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a  l=%d\n".      "J
b220: 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f  ournal:       jo
b230: 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f  urnalOff=%lld jo
b240: 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22  urnalHdr=%lld\n"
b250: 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20  .      "Size:   
b260: 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64         dbsize=%d
b270: 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64   dbOrigSize=%d d
b280: 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a  bFileSize=%d\n".
b290: 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65        , p->zFile
b2a0: 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  name.      , p->
b2b0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
b2c0: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20  EN            ? 
b2d0: 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20  "OPEN" :.       
b2e0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b2f0: 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20  R_READER        
b300: 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20    ? "READER" :. 
b310: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
b320: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
b330: 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45  OCKED   ? "WRITE
b340: 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20  R_LOCKED" :.    
b350: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b360: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
b370: 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43  EMOD ? "WRITER_C
b380: 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20  ACHEMOD" :.     
b390: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b3a0: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
b3b0: 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42      ? "WRITER_DB
b3c0: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b3d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b3e0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
b3f0: 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ? "WRITER_FINISH
b400: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
b410: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
b420: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f  RROR           ?
b430: 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72   "ERROR" : "?err
b440: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
b450: 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  t)p->errCode.   
b460: 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e     , p->eLock==N
b470: 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f  O_LOCK         ?
b480: 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20   "NO_LOCK" :.   
b490: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52       p->eLock==R
b4a0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f  ESERVED_LOCK   ?
b4b0: 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20   "RESERVED" :.  
b4c0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b4d0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
b4e0: 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a  ? "EXCLUSIVE" :.
b4f0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
b500: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  ==SHARED_LOCK   
b510: 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20    ? "SHARED" :. 
b520: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b530: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20  =UNKNOWN_LOCK   
b540: 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22   ? "UNKNOWN" : "
b550: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
b560: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
b570: 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20  e ? "exclusive" 
b580: 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20  : "normal".     
b590: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64   , p->journalMod
b5a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b5b0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20  MODE_MEMORY   ? 
b5c0: 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20  "memory" :.     
b5d0: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b5e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b5f0: 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20  MODE_OFF      ? 
b600: 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20  "off" :.        
b610: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b620: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b630: 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65  E_DELETE   ? "de
b640: 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  lete" :.        
b650: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b660: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b670: 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65  E_PERSIST  ? "pe
b680: 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20  rsist" :.       
b690: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b6a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b6b0: 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74  DE_TRUNCATE ? "t
b6c0: 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20  runcate" :.     
b6d0: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b6e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b6f0: 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20  MODE_WAL      ? 
b700: 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f  "wal" : "?error?
b710: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b720: 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74  ->tempFile, (int
b730: 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29  )p->memDb, (int)
b740: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  p->useJournal.  
b750: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
b760: 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48  Off, p->journalH
b770: 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  dr.      , (int)
b780: 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29  p->dbSize, (int)
b790: 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28  p->dbOrigSize, (
b7a0: 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a  int)p->dbFileSiz
b7b0: 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e.  );..  return
b7c0: 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
b7d0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
b7e0: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 76 61  rences to the va
b7f0: 72 69 6f 75 73 20 70 61 67 65 20 67 65 74 74 65  rious page gette
b800: 72 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  rs */.static int
b810: 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50   getPageNormal(P
b820: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b830: 65 2a 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63  e**,int);.static
b840: 20 69 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f   int getPageErro
b850: 72 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62  r(Pager*,Pgno,Db
b860: 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66  Page**,int);.#if
b870: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b880: 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
b890: 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 50  nt getPageMMap(P
b8a0: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b8b0: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66  e**,int);.#endif
b8c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
b8d0: 50 61 67 65 72 2e 78 47 65 74 20 6d 65 74 68 6f  Pager.xGet metho
b8e0: 64 20 66 6f 72 20 74 68 65 20 61 70 70 72 6f 70  d for the approp
b8f0: 72 69 61 74 65 20 72 6f 75 74 69 6e 65 20 75 73  riate routine us
b900: 65 64 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63  ed to fetch.** c
b910: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
b920: 70 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pager..*/.static
b930: 20 76 6f 69 64 20 73 65 74 47 65 74 74 65 72 4d   void setGetterM
b940: 65 74 68 6f 64 28 50 61 67 65 72 20 2a 70 50 61  ethod(Pager *pPa
b950: 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
b960: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
b970: 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20     pPager->xGet 
b980: 3d 20 67 65 74 50 61 67 65 45 72 72 6f 72 3b 0a  = getPageError;.
b990: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
b9a0: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c  MAP_SIZE>0.  }el
b9b0: 73 65 20 69 66 28 20 55 53 45 46 45 54 43 48 28  se if( USEFETCH(
b9c0: 70 50 61 67 65 72 29 0a 23 69 66 64 65 66 20 53  pPager).#ifdef S
b9d0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
b9e0: 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43     && pPager->xC
b9f0: 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20  odec==0.#endif. 
ba00: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ba10: 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4d 4d  xGet = getPageMM
ba20: 61 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ap;.#endif /* SQ
ba30: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
ba40: 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  ZE>0 */.  }else{
ba50: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65  .    pPager->xGe
ba60: 74 20 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d 61  t = getPageNorma
ba70: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
ba80: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
ba90: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
baa0: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
bab0: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
bac0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
bad0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
bae0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
baf0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
bb00: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
bb10: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
bb20: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
bb30: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
bb40: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
bb50: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
bb60: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
bb70: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
bb80: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
bb90: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
bba0: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
bbb0: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
bbc0: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
bbd0: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
bbe0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
bbf0: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
bc00: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
bc10: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
bc20: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
bc30: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
bc40: 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  *p;.  Pgno pgno 
bc50: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69  = pPg->pgno;.  i
bc60: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
bc70: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
bc80: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
bc90: 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53   p = &pPager->aS
bca0: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
bcb0: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
bcc0: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
bcd0: 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75  3BitvecTestNotNu
bce0: 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  ll(p->pInSavepoi
bcf0: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
bd00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
bd10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bd20: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
bd30: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
bd40: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
bd50: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
bd60: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
bd70: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
bd80: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
bd90: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
bda0: 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
bdb0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
bdc0: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
bdd0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
bde0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e  Pg->pgno);.}.#en
bdf0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
be00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
be10: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
be20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
be30: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
be40: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
be50: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
be60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
be70: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
be80: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
be90: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
bea0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
beb0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
bec0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
bed0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
bee0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
bef0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
bf00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
bf10: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
bf20: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
bf30: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
bf40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
bf50: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
bf60: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
bf70: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
bf80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bf90: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
bfa0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
bfb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bfc0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
bfd0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
bfe0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
bff0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
c000: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
c010: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
c020: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
c030: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
c040: 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  B).../*.** Write
c050: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
c060: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
c070: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c080: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
c090: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
c0a0: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
c0b0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
c0c0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
c0d0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
c0e0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
c0f0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
c100: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
c110: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
c120: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
c130: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
c140: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
c150: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
c160: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
c170: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c180: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
c190: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
c1a0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20  ther NO_LOCK.** 
c1b0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20  or SHARED_LOCK. 
c1c0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
c1d0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
c1e0: 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b   call to xUnlock
c1f0: 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20  ().** succeeds, 
c200: 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c  set the Pager.eL
c210: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
c220: 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d  match the (attem
c230: 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a  pted) new lock..
c240: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
c250: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
c260: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
c270: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
c280: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
c290: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
c2a0: 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63  fy it. See the c
c2b0: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
c2c0: 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20   #define of .** 
c2d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
c2e0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
c2f0: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
c300: 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f  ic int pagerUnlo
c310: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
c320: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
c330: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c340: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
c350: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c360: 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
c370: 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20  r->eLock==eLock 
c380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
c390: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck==NO_LOCK || e
c3a0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c3b0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
c3c0: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
c3d0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
c3e0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ger)==0 );.  if(
c3f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c400: 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
c410: 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
c420: 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72  >=eLock );.    r
c430: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
c440: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
c450: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
c460: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c470: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ck);.    if( pPa
c480: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
c490: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
c4a0: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c4b0: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c4c0: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
c4d0: 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  "UNLOCK %p %d\n"
c4e0: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
c4f0: 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ).  }.  return r
c500: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
c510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c520: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63  le to level eLoc
c530: 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  k, which must be
c540: 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c   either SHARED_L
c550: 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44  OCK,.** RESERVED
c560: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
c570: 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20  VE_LOCK. If the 
c580: 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73  caller is succes
c590: 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a  sful, set the.**
c5a0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
c5b0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77  iable to the new
c5c0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20   locking state. 
c5d0: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
c5e0: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
c5f0: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
c600: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
c610: 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63  unction is .** c
c620: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
c630: 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74  dify it unless t
c640: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
c650: 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56  tate is EXCLUSIV
c660: 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20  E_LOCK. .** See 
c670: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
c680: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
c690: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
c6a0: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
c6b0: 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f   .** of this..*/
c6c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c6d0: 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70  rLockDb(Pager *p
c6e0: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
c6f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c700: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
c710: 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  rt( eLock==SHARE
c720: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
c730: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
c740: 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  | eLock==EXCLUSI
c750: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  VE_LOCK );.  if(
c760: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65   pPager->eLock<e
c770: 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Lock || pPager->
c780: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
c790: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  OCK ){.    rc = 
c7a0: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c7b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c7c0: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
c7d0: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
c7e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c7f0: 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d  E_OK && (pPager-
c800: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c810: 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43  LOCK||eLock==EXC
c820: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a  LUSIVE_LOCK) ){.
c830: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
c840: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
c850: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
c860: 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
c870: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
c880: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c890: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c8a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
c8b0: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
c8c0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
c8d0: 69 63 2d 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61  ic-write or.** a
c8e0: 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74  tomic-batch-writ
c8f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
c900: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
c910: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
c920: 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  .** atomic-write
c930: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
c940: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
c950: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
c960: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
c970: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c980: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
c990: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
c9a0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
c9b0: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
c9c0: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
c9d0: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
c9e0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
c9f0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
ca00: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
ca10: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
ca20: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
ca30: 2a 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  * If it can be u
ca40: 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  sed, then the va
ca50: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
ca60: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
ca70: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
ca80: 20 77 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   when it contain
ca90: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
caa0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
cab0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
cac0: 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69  atomic-batch-wri
cad0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
cae0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 4f  can be used if O
caf0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
cb00: 69 73 74 69 63 73 28 29 0a 2a 2a 20 72 65 74 75  istics().** retu
cb10: 72 6e 73 20 61 20 76 61 6c 75 65 20 77 69 74 68  rns a value with
cb20: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
cb30: 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20 62  P_BATCH_ATOMIC b
cb40: 69 74 20 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a  it set. -1 is.**
cb50: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69   returned in thi
cb60: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
cb70: 20 6e 65 69 74 68 65 72 20 6f 70 74 69 6d 69 7a   neither optimiz
cb80: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
cb90: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
cba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cbb0: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
cbc0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
cbd0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
cbe0: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
cbf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
cc00: 4f 4d 49 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c  OMIC_WRITE) \. |
cc10: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
cc20: 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
cc30: 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 69 6e  OMIC_WRITE).  in
cc40: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
cc70: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20  teristics */..  
cc80: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
cc90: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
cca0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
ccb0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
ccc0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
ccd0: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
cce0: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 72  PARAMETER(pPager
ccf0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
cd00: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
cd10: 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
cd20: 54 45 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  TE.  if( pPager-
cd30: 3e 64 62 53 69 7a 65 3e 30 20 26 26 20 28 64 63  >dbSize>0 && (dc
cd40: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
cd50: 54 43 48 5f 41 54 4f 4d 49 43 29 20 29 7b 0a 20  TCH_ATOMIC) ){. 
cd60: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
cd70: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
cd80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
cd90: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 7b 0a  TOMIC_WRITE.  {.
cda0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 20      int nSector 
cdb0: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
cdc0: 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
cdd0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
cde0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
cdf0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
ce00: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
ce10: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
ce20: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
ce30: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
ce40: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
ce50: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
ce60: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
ce70: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
ce80: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
ce90: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
cea0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
ceb0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
cec0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
ced0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
cee0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
cef0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
cf00: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
cf10: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
cf20: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
cf30: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
cf40: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
cf50: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
cf60: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
cf70: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
cf80: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
cf90: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
cfa0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
cfb0: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
cfc0: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
cfd0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
cfe0: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
cff0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
d000: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
d010: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
d020: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
d030: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
d040: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
d050: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
d060: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
d070: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
d080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
d090: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
d0a0: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
d0b0: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
d0c0: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
d0d0: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
d0e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
d0f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
d100: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
d110: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
d120: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
d130: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
d140: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
d150: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
d160: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
d170: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
d180: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
d190: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
d1a0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
d1b0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
d1c0: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
d1d0: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
d1e0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
d1f0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
d200: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
d210: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
d220: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
d230: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
d240: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
d250: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
d260: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
d270: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
d280: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
d290: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
d2a0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
d2b0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
d2c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
d2d0: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
d2e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
d2f0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
d300: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
d310: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
d320: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
d330: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
d340: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
d350: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
d360: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
d370: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
d380: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
d390: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
d3a0: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
d3b0: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
d3c0: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
d3d0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
d3e0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
d3f0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
d400: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
d410: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
d420: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
d430: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
d440: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d450: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
d460: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
d470: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
d480: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
d490: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
d4a0: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
d4b0: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
d4c0: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
d4d0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
d4e0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
d4f0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
d500: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d510: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
d520: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
d530: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
d540: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
d550: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
d560: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
d570: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
d580: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
d590: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
d5a0: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
d5b0: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
d5c0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
d5d0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
d5e0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
d5f0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
d600: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
d610: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
d620: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
d630: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
d640: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
d650: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
d660: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
d670: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
d680: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
d690: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
d6a0: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
d6b0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
d6c0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
d6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
d6e0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
d6f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
d700: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
d710: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
d720: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
d730: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
d740: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
d750: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
d760: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
d770: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
d780: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
d790: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
d7a0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
d7b0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
d7c0: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
d7d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
d7e0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
d7f0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
d800: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
d810: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
d820: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d830: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
d840: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
d850: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
d860: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
d870: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
d880: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
d890: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
d8a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
d8b0: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
d8c0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
d8d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d900: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d920: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
d930: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
d940: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
d950: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
d960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
d970: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
d980: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
d990: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
d9a0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
d9b0: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
d9c0: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
d9d0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
d9e0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da00: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
da10: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
da20: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
da30: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
da40: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
da50: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
da60: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
da70: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
da80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
da90: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
daa0: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
dab0: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
dac0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
dad0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
dae0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
daf0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
db00: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a  er .   || len>sz
db10: 4a 2d 31 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d  J-16.   || len==
db20: 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  0 .   || SQLITE_
db30: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
db40: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
db50: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
db60: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
db70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
db80: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
db90: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
dba0: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
dbb0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
dbc0: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
dbd0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
dbe0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
dbf0: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
dc00: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
dc10: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dc20: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
dc30: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
dc40: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
dc50: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
dc60: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
dc70: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
dc80: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
dc90: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
dca0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
dcb0: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
dcc0: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
dcd0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
dce0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
dcf0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
dd00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dd10: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
dd20: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
dd30: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
dd40: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
dd50: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
dd60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
dd70: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
dd80: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
dd90: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
dda0: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
ddb0: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
ddc0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
ddd0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
dde0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
ddf0: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
de00: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
de10: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
de20: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
de30: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
de40: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
de50: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
de60: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
de70: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
de80: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
de90: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
dea0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
deb0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
dec0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
ded0: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
dee0: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
def0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df10: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
df80: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
df90: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
dfa0: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
dfb0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
dfc0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
dfd0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
dfe0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
dff0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
e000: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
e010: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
e020: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
e030: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
e040: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e050: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
e060: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
e070: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
e080: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e090: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
e0a0: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
e0b0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
e0c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
e0d0: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
e0e0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
e0f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
e100: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
e110: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
e120: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
e130: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
e140: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
e150: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
e160: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
e170: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
e180: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
e190: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
e1a0: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
e1b0: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
e1c0: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
e1d0: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
e1e0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
e1f0: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
e200: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
e210: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
e220: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
e230: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
e240: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
e250: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
e260: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
e270: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e280: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
e290: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
e2a0: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
e2b0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
e2c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e2d0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
e2e0: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
e2f0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
e300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
e310: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
e320: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
e330: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
e340: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
e350: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
e360: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
e370: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
e380: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
e390: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
e3a0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
e3b0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
e3c0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
e3d0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
e3e0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
e3f0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
e400: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
e410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
e420: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
e430: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
e440: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
e450: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
e460: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
e470: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
e480: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
e490: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
e4a0: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
e4b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e4c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e4d0: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
e4e0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
e4f0: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
e500: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e510: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
e540: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
e550: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
e560: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
e570: 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49  !sqlite3JournalI
e580: 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
e590: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
e5a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e5b0: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
e5c0: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
e5d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
e5e0: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
e5f0: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
e600: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
e610: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
e620: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
e630: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
e640: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
e650: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e660: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
e670: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
e680: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
e690: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
e6a0: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
e6b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e6c0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
e6d0: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
e6e0: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
e6f0: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
e700: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e710: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
e720: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
e730: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
e740: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
e750: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
e760: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
e770: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
e780: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
e790: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
e7a0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
e7b0: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
e7c0: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
e7d0: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
e7e0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
e7f0: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
e800: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
e810: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
e820: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
e830: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
e840: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
e850: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
e860: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
e870: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
e880: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
e890: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
e8a0: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
e8b0: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
e8c0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
e8d0: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
e8e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e8f0: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
e900: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
e910: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e920: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
e930: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
e940: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
e950: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
e960: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
e970: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e980: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
e990: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
e9a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e9b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e9c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
e9d0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
e9e0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
e9f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
ea00: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
ea10: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
ea20: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
ea30: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
ea40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
ea50: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
ea60: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
ea70: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
ea80: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
ea90: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
eaa0: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
eab0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
eac0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
ead0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
eae0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
eaf0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
eb00: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
eb10: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
eb20: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
eb30: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
eb40: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
eb50: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
eb60: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
eb70: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
eb80: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
eb90: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
eba0: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
ebb0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
ebc0: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
ebd0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
ebe0: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
ebf0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
ec00: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
ec10: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
ec20: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
ec30: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
ec40: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
ec50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ec70: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
ec80: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
ec90: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
eca0: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
ecb0: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
ecc0: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
ecd0: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
ece0: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
ecf0: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
ed00: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
ed10: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
ed20: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
ed50: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
ed60: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
ed70: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
eda0: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
edb0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
edc0: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
edd0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
ede0: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
edf0: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
ee00: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ee10: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
ee20: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
ee30: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ee40: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ee50: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
ee60: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
ee70: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
ee80: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
ee90: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
eea0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
eeb0: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
eec0: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
eed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
eee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
eef0: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
ef00: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
ef10: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
ef20: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
ef30: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
ef40: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
ef50: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
ef60: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
ef70: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
ef80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
ef90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
efa0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
efb0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
efc0: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
efd0: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
efe0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
eff0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
f000: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
f010: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
f020: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
f030: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
f040: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
f050: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
f060: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
f070: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
f080: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
f090: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
f0a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
f0b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
f0c0: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
f0d0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
f0e0: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
f0f0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
f100: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
f110: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
f120: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
f130: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
f140: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
f150: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
f160: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
f170: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
f180: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
f190: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
f1a0: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
f1b0: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
f1c0: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
f1d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f1e0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
f1f0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
f200: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
f210: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
f220: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
f230: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
f240: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
f250: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
f260: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
f270: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
f280: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
f290: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
f2a0: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
f2b0: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
f2c0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
f2d0: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
f2e0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
f2f0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
f300: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
f310: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
f320: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
f330: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
f340: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
f350: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
f360: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
f370: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
f380: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
f390: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
f3a0: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
f3b0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
f3c0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
f3d0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
f3e0: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
f3f0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
f400: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
f410: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
f420: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
f430: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
f440: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
f450: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
f460: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
f470: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
f480: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
f490: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
f4a0: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
f4b0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f4c0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f4d0: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
f4e0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f4f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
f500: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
f510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
f520: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
f530: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f540: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
f550: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
f560: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
f570: 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  izer */ .  sqlit
f580: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
f590: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
f5a0: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
f5b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
f5c0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f5d0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f5e0: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
f5f0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
f600: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
f610: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
f620: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
f630: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f640: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
f650: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
f660: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
f670: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
f680: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
f690: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
f6a0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f6b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f6c0: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
f6d0: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
f6e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
f6f0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f700: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f710: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
f720: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
f730: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
f740: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
f750: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
f760: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
f770: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
f780: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
f790: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f7a0: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
f7b0: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
f7c0: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
f7d0: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
f7e0: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
f7f0: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
f800: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
f810: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
f820: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
f830: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
f840: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f850: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
f860: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
f870: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
f880: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
f890: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
f8a0: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
f8b0: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
f8c0: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
f8d0: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
f8e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
f8f0: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
f900: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
f910: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
f920: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
f930: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
f940: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
f950: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
f960: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
f970: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
f980: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
f990: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
f9a0: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
f9b0: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
f9c0: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
f9d0: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
f9e0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
f9f0: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
fa00: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
fa10: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
fa20: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
fa30: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
fa40: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
fa50: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
fa60: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
fa70: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
fa80: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
fa90: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
faa0: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
fab0: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
fac0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
fad0: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
fae0: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
faf0: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
fb00: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
fb10: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
fb20: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
fb30: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
fb40: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
fb50: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
fb60: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
fb70: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
fb80: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
fb90: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
fba0: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
fbb0: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
fbc0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
fbd0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
fbe0: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
fbf0: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
fc00: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
fc10: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
fc20: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
fc30: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
fc40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
fc50: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
fc60: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
fc70: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
fc80: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
fc90: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
fca0: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
fcb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
fcc0: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
fcd0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
fce0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
fcf0: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
fd00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fd10: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
fd20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fd30: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
fd40: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
fd50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fd60: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
fd70: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
fd80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
fd90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
fda0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
fdb0: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
fdc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fdd0: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
fde0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
fdf0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
fe00: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
fe10: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
fe20: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
fe30: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
fe40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
fe50: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
fe60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fe70: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
fe80: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
fe90: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
fea0: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
feb0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
fec0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
fed0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
fee0: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
fef0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
ff00: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
ff10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
ff20: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
ff30: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
ff40: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
ff50: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
ff60: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
ff70: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
ff80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
ff90: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
ffa0: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
ffb0: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
ffc0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
ffd0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
ffe0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
fff0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
10000 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
10010 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10020 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
10030 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
10040 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
10050 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
10060 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
10070 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
10080 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
10090 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
100a0 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
100b0 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
100c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
100d0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
100e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
100f0 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
10100 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
10110 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
10120 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
10130 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
10140 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
10150 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
10160 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10170 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
10180 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
10190 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
101a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
101b0 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
101c0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
101d0 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
101e0 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
101f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10200 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
10210 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
10220 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
10230 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10250 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10260 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10270 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
10280 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
10290 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
102a0 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
102b0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
102c0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
102d0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
102e0 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
102f0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
10300 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
10310 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
10320 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
10330 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
10340 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
10350 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
10360 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
10370 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
10380 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
10390 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
103a0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
103b0 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
103c0 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
103d0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
103e0 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
103f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10400 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
10410 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
10420 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
10430 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
10440 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
10450 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
10460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10470 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
10480 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
10490 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
104a0 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
104b0 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
104c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
104d0 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
104e0 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
104f0 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
10500 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
10510 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
10520 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
10530 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
10540 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
10550 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
10560 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
10570 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
10580 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
10590 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
105a0 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
105b0 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
105c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
105d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
105e0 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
105f0 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
10600 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10610 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10620 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
10630 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
10640 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
10650 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
10660 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10670 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10680 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
10690 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
106a0 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
106b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
106c0 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
106d0 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
106e0 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
106f0 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
10700 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
10710 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
10720 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
10730 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
10740 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
10750 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
10760 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
10770 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10780 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10790 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
107a0 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
107b0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
107c0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
107d0 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
107e0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
107f0 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
10800 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
10810 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10820 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
10830 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
10840 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10850 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
10860 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
10870 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
10880 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10890 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
108a0 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
108b0 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
108c0 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
108d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
108e0 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
108f0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
10900 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
10910 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
10920 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
10930 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
10940 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
10950 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10960 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
10970 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10980 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
10990 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
109a0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
109b0 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
109c0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
109d0 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
109e0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
109f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
10a00 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
10a10 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
10a20 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
10a30 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
10a40 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
10a50 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
10a60 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
10a70 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
10a80 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
10a90 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
10aa0 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
10ab0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
10ac0 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
10ad0 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10ae0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
10af0 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
10b00 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
10b10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
10b20 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
10b30 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
10b40 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
10b50 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
10b60 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
10b70 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
10b80 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
10b90 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
10ba0 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
10bb0 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
10bc0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
10bd0 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
10be0 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
10bf0 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
10c00 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
10c10 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
10c20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
10c30 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
10c40 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
10c50 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
10c60 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
10c70 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
10c80 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
10c90 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
10ca0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
10cb0 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
10cc0 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
10cd0 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
10ce0 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
10cf0 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
10d00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10d10 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
10d20 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
10d30 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
10d40 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
10d50 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
10d60 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
10d70 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
10d80 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10d90 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
10da0 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
10db0 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
10dc0 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
10dd0 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
10de0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
10df0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
10e00 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
10e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e20 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
10e30 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10e40 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
10e50 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
10e60 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10e70 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
10e80 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
10e90 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
10ea0 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
10eb0 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
10ec0 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
10ed0 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
10ee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
10ef0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
10f00 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
10f10 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
10f20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
10f30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10f40 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
10f50 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
10f60 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
10f70 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
10f80 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
10f90 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
10fa0 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
10fb0 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
10fc0 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
10fd0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
10fe0 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
10ff0 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
11000 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
11010 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
11020 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
11030 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
11040 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
11050 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
11060 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
11070 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
11080 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
11090 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
110a0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
110b0 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
110c0 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
110d0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
110e0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
110f0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
11100 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
11110 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
11120 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11130 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
11140 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
11150 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
11160 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
11170 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
11180 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
11190 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
111a0 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
111b0 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
111c0 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
111d0 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
111e0 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
111f0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
11200 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
11210 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
11220 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
11230 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
11240 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
11250 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
11260 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
11270 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
11280 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
11290 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
112a0 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
112b0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
112c0 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
112d0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
112e0 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
112f0 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
11300 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
11310 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
11320 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
11330 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
11340 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
11350 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
11360 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
11370 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
11380 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
11390 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
113a0 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
113b0 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
113c0 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
113d0 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
113e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
113f0 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
11400 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
11410 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
11420 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
11430 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
11440 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
11450 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
11460 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
11470 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
11480 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
11490 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
114c0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
114d0 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
114e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
114f0 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
11500 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
11510 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11530 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
11540 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
11550 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
11560 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
11570 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11580 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
11590 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
115a0 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115c0 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
115d0 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
115e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
115f0 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
11600 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
11610 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
11620 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
11630 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
11640 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
11650 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11660 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21  _MEMORY .   || !
11670 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
11680 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  fd).  ){.    ret
11690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
116a0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
116b0 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
116c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
116d0 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
116e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
116f0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
11700 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
11710 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
11720 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
11730 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
11740 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
11750 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
11760 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
11770 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
11780 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
11790 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
117a0 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
117b0 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
117c0 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
117d0 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
117e0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
117f0 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
11800 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
11810 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
11820 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
11830 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
11840 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
11850 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
11860 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
11870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
11880 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
11890 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
118a0 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
118b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
118c0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
118d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
118e0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
118f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
11900 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
11910 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
11920 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
11930 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
11940 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
11950 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
11960 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
11970 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
11980 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
11990 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
119a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
119b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
119c0 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
119d0 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
119e0 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
119f0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11a00 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11a10 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
11a20 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
11a30 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11a40 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11a50 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
11a60 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
11a70 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
11a80 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
11a90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
11aa0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a  ournalMagic, 8,.
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
11ae0 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
11af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11b00 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11b10 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
11b20 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
11b30 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
11b40 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
11b50 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
11b60 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
11b70 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
11b80 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
11b90 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
11ba0 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
11bb0 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
11bc0 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
11bd0 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
11be0 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
11bf0 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
11c00 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
11c10 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
11c20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
11c30 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
11c40 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
11c50 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
11c60 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
11c70 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
11c80 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
11c90 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
11ca0 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
11cb0 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
11cc0 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
11cd0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
11ce0 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
11cf0 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
11d00 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
11d10 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
11d20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
11d30 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
11d40 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
11d50 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
11d60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11d70 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
11d80 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11d90 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
11da0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11db0 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
11dc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69   rc;.}../*.** Di
11dd0 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
11de0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11df0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d   in-memory page-
11e00 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
11e10 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
11e20 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
11e30 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74  {.  pPager->iDat
11e40 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71  aVersion++;.  sq
11e50 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
11e60 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
11e70 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  up);.  sqlite3Pc
11e80 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
11e90 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
11ea0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11eb0 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11ec0 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33  sion value.*/.u3
11ed0 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 61  2 sqlite3PagerDa
11ee0 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20  taVersion(Pager 
11ef0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
11f00 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  rn pPager->iData
11f10 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  Version;.}../*.*
11f20 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
11f30 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
11f40 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
11f50 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
11f60 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
11f70 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
11f80 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
11f90 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
11fa0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
11fb0 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
11fc0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
11fd0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11fe0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
11ff0 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
12000 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
12010 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
12020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12030 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
12040 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
12050 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
12060 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
12070 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
12080 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
12090 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
120a0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
120b0 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
120c0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
120d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
120e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
120f0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49   sqlite3JournalI
12100 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
12110 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
12120 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
12130 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
12140 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12150 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
12160 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
12170 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
12180 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
12190 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
121a0 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
121b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
121c0 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
121d0 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
121e0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
121f0 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
12200 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
12210 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
12220 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
12230 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
12240 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
12250 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
12260 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
12270 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
12280 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
12290 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
122a0 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
122d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
122e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
122f0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
12300 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
12310 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
12320 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
12330 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
12340 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
12350 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
12360 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
12370 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
12380 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
12390 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
123a0 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
123b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
123c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
123d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
123e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
123f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
12400 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
12410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12420 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12430 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
12440 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12450 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
12460 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
12470 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
12480 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
12490 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
124a0 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
124b0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
124c0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
124d0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
124e0 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
124f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
12500 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
12510 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
12520 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
12530 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
12540 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
12550 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
12560 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
12570 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
12580 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
12590 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
125a0 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
125b0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
125c0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
125d0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
125e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
125f0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
12600 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12610 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
12620 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
12630 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
12640 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
12650 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
12660 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
12670 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
12680 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
12690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
126a0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
126b0 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
126c0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
126d0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
126e0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
126f0 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
12700 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
12710 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
12720 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
12730 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
12740 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12750 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
12760 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
12770 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
12780 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
12790 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
127a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
127b0 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
127c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
127d0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
127e0 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
127f0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
12800 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
12810 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
12820 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
12830 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
12840 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
12850 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
12860 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
12870 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
12880 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
12890 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
128a0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
128b0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
128c0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
128d0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
128e0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
128f0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
12900 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
12930 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
12940 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
12950 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
12960 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
12970 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
12980 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
12990 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
129a0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
129b0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
129c0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
129d0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
129e0 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
129f0 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
12a00 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
12a10 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12a20 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
12a30 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
12a40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
12a50 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
12a60 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
12a70 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
12a80 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
12a90 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
12aa0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12ab0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
12ac0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
12ad0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12ae0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
12af0 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
12b00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12b10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12b20 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
12b30 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12b40 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12b50 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
12b60 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12b70 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12b80 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
12b90 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
12ba0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12bb0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
12bc0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
12bd0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
12be0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
12bf0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12c00 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
12c10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12c20 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
12c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12c40 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
12c50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12c60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
12c70 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12c80 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
12c90 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
12ca0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
12cb0 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
12cc0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
12cd0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
12ce0 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
12cf0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
12d00 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
12d10 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
12d20 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
12d30 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
12d40 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
12d50 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
12d60 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
12d70 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
12d80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12d90 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
12da0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
12db0 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
12dc0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
12dd0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
12de0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
12df0 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
12e00 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
12e10 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
12e20 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
12e30 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
12e40 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
12e50 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
12e60 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
12e70 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
12e80 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
12e90 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
12ea0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
12eb0 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
12ec0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
12ed0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12ee0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12ef0 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12f00 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12f10 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12f20 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12f30 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12f40 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12f50 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12f60 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12f70 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12f80 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12f90 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12fa0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12fb0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
12fc0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
12fd0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12fe0 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12ff0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
13000 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
13010 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
13020 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
13030 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
13040 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
13050 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
13060 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
13070 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
13080 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
13090 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
130a0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
130b0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
130c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
130d0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
130e0 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
130f0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
13100 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
13110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13120 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
13130 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   (isOpen(pPager-
13140 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f 50  >jfd) ? PAGER_OP
13150 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44 45  EN : PAGER_READE
13160 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
13170 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
13180 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
13190 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
131a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  , 0, 0);.    pPa
131b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
131c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 65  QLITE_OK;.    se
131d0 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50  tGetterMethod(pP
131e0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 50  ager);.  }..  pP
131f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13200 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13210 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
13220 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
13230 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter = 0;.}../*.*
13240 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13250 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
13260 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46  er an IOERR or F
13270 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72  ULL error that r
13280 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70  equires.** the p
13290 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69  ager to transiti
132a0 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  on into the ERRO
132b0 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76 65  R state may ahve
132c0 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68   occurred..** Th
132d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
132e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
132f0 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
13300 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
13310 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63   .** the error-c
13320 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
13330 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
13340 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
13350 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20  . The .** value 
13360 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
13370 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
13380 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
13390 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
133a0 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
133b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
133c0 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
133d0 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
133e0 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75   the.** IOERR su
133f0 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67  b-codes, the pag
13400 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45 52  er enters the ER
13410 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68  ROR state and th
13420 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
13430 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  is stored in Pag
13440 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c  er.errCode. Whil
13450 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d 61  e the pager rema
13460 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ins in the ERROR
13470 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d   state,.** all m
13480 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f  ajor API calls o
13490 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c  n the Pager will
134a0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
134b0 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64  urn Pager.errCod
134c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52  e..**.** The ERR
134d0 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61 74  OR state indicat
134e0 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
134f0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
13500 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
13510 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
13520 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
13530 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
13540 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
13550 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
13560 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
13570 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
13580 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
13590 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
135a0 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
135b0 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74  occurred, then t
135c0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
135d0 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
135e0 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74  to be replayed t
135f0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f  o restore the co
13600 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
13610 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
13620 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20  if.** it were a 
13630 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f  hot-journal)..*/
13640 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13650 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
13660 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
13670 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
13680 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
13690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
136a0 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
136b0 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
136c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
136d0 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
136e0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
136f0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
13700 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
13710 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
13720 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
13730 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d    );.  if( rc2==
13740 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72  SQLITE_FULL || r
13750 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
13760 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
13770 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
13780 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
13790 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a   = PAGER_ERROR;.
137a0 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74      setGetterMet
137b0 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  hod(pPager);.  }
137c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
137d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
137e0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
137f0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
13800 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
13810 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  e write transact
13820 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67  ion open on pPag
13830 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  er is being comm
13840 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d  itted (bCommit==
13850 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20  1).** or rolled 
13860 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30  back (bCommit==0
13870 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )..**.** Return 
13880 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79  TRUE if and only
13890 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61   if all dirty pa
138a0 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 66 6c  ges should be fl
138b0 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ushed to disk..*
138c0 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a  *.** Rules:.**.*
138d0 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54  *   *  For non-T
138e0 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c 20 61  EMP databases, a
138f0 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20 64 69  lways sync to di
13900 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  sk.  This is nec
13910 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20 20 66  essary.**      f
13920 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  or transactions 
13930 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a  to be durable..*
13940 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20 54  *.**   *  Sync T
13950 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f 6e 6c  EMP database onl
13960 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e  y on a COMMIT (n
13970 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77  ot a ROLLBACK) w
13980 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e 67 0a  hen the backing.
13990 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68 61 73  **      file has
139a0 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 61 6c   been created al
139b0 72 65 61 64 79 20 28 76 69 61 20 61 20 73 70 69  ready (via a spi
139c0 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72 65 73  ll on pagerStres
139d0 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20  s()) and.**     
139e0 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
139f0 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
13a00 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65 65 64  in memory exceed
13a10 73 20 32 35 25 20 6f 66 20 74 68 65 20 74 6f 74  s 25% of the tot
13a20 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63 68 65  al.**      cache
13a30 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
13a40 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73 68 4f   int pagerFlushO
13a50 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  nCommit(Pager *p
13a60 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  Pager, int bComm
13a70 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  it){.  if( pPage
13a80 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
13a90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
13aa0 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65 74 75   !bCommit ) retu
13ab0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69 73 4f  rn 0;.  if( !isO
13ac0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
13ad0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
13ae0 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50 43 61  turn (sqlite3PCa
13af0 63 68 65 50 65 72 63 65 6e 74 44 69 72 74 79 28  chePercentDirty(
13b00 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13b10 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >=25);.}../*.** 
13b20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
13b30 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
13b40 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
13b50 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
13b60 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
13b70 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
13b80 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
13b90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
13ba0 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
13bb0 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
13bc0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
13bd0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
13be0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
13bf0 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
13c00 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
13c10 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
13c20 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
13c30 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
13c40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
13c50 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
13c60 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
13c70 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
13c80 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
13c90 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
13ca0 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
13cb0 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
13cc0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
13cd0 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
13ce0 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
13cf0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
13d00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
13d10 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
13d20 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
13d30 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
13d40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
13d50 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
13d60 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
13d70 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
13d80 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
13d90 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
13da0 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
13db0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
13dc0 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
13dd0 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
13de0 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
13df0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
13e00 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
13e10 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
13e20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
13e30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
13e40 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
13e50 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
13e60 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
13e70 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
13e80 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13e90 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13ea0 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
13eb0 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
13ec0 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
13ed0 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
13ee0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
13ef0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13f00 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
13f10 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
13f20 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
13f30 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
13f40 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
13f50 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
13f60 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
13f70 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
13f80 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
13f90 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
13fa0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
13fb0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
13fc0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
13fd0 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
13fe0 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
13ff0 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
14000 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
14010 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
14020 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
14030 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
14040 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
14050 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
14060 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
14070 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
14080 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
14090 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
140a0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
140b0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
140c0 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
140d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
140e0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
140f0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
14100 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
14110 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
14120 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
14130 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
14140 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
14150 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
14160 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
14170 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
14180 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
14190 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
141a0 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
141b0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
141c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
141d0 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
141e0 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
141f0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
14200 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
14210 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
14220 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
14230 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
14240 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
14250 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
14260 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
14270 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
14280 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
14290 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
142a0 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
142b0 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
142c0 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
142d0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
142e0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
142f0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
14300 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
14310 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
14320 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
14330 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
14340 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
14350 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
14360 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
14370 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
14380 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
14390 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
143a0 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
143b0 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
143c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
143d0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
143e0 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
143f0 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
14400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14410 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
14420 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
14430 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
14440 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
14450 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
14460 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
14470 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
14480 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
14490 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
144a0 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
144b0 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
144c0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
144d0 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
144e0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
144f0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
14500 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d  Master, int bCom
14510 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  mit){.  int rc =
14520 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
14530 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
14540 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  rom journal fina
14550 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69  lization operati
14560 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20  on */.  int rc2 
14570 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14580 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
14590 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f  rom db file unlo
145a0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ck operation */.
145b0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
145c0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f   if the pager do
145d0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f  es not have an o
145e0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
145f0 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74  ction.  ** or at
14600 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
14610 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e  D lock. This fun
14620 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
14630 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20  led when there. 
14640 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d   ** is no write-
14650 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
14660 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45  ve but a RESERVE
14670 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
14680 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75  k is.  ** held u
14690 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73  nder two circums
146a0 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a  tances:.  **.  *
146b0 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73  *   1. After a s
146c0 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f  uccessful hot-jo
146d0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
146e0 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  it is called wit
146f0 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61  h.  **      eSta
14700 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61  te==PAGER_NONE a
14710 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
14720 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20  IVE_LOCK..  **. 
14730 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f   **   2. If a co
14740 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f  nnection with lo
14750 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
14760 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  sive holding an 
14770 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20  EXCLUSIVE .  ** 
14780 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68       lock switch
14790 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69  es back to locki
147a0 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61  ng_mode=normal a
147b0 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73  nd then executes
147c0 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61   a.  **      rea
147d0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  d-transaction, t
147e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
147f0 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61  called with eSta
14800 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
14810 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20   .  **      and 
14820 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
14830 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72  _LOCK when the r
14840 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
14850 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a  is closed..  */.
14860 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
14870 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
14880 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
14890 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
148a0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
148b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
148c0 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54  State<PAGER_WRIT
148d0 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61  ER_LOCKED && pPa
148e0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52  ger->eLock<RESER
148f0 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
14900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14910 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65  ;.  }..  release
14920 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
14930 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
14940 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
14950 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
14960 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20  pInJournal==0 . 
14970 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33       || (sqlite3
14980 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
14990 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
149a0 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
149b0 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20  _BATCH_ATOMIC). 
149c0 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
149d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
149e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
149f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14a00 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
14a10 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
14a20 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
14a30 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
14a40 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
14a50 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
14a60 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61    /* assert( pPa
14a70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14a80 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14a90 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f  ODE_MEMORY ); */
14aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
14ab0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
14ac0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
14ad0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14ae0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14af0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
14b00 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
14b10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14b20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
14b30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14b40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b60 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
14b70 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
14b80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14b90 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
14ba0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
14bb0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
14bc0 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c  sure the new fil
14bd0 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74 65  e size is writte
14be0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65  n into the inode
14bf0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
14c00 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
14c10 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ise the journal 
14c20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74 20  might resurrect 
14c30 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
14c40 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20  r loss and.     
14c50 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
14c60 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69  e last transacti
14c70 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  on to roll back.
14c80 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20 20    See.          
14c90 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  ** https://bugzi
14ca0 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f  lla.mozilla.org/
14cb0 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
14cc0 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20 20  1072773.        
14cd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
14ce0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
14cf0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
14d00 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
14d10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14d20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
14d30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14d40 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
14d50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14d60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14d70 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
14d80 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
14d90 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14da0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
14db0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
14dc0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
14dd0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
14de0 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
14df0 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
14e00 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  r||pPager->tempF
14e10 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ile);.      pPag
14e20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14e30 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14e40 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
14e50 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
14e60 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
14e70 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
14e80 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
14e90 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14ea0 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14eb0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
14ec0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14ed0 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
14ee0 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
14ef0 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
14f00 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
14f10 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14f20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14f30 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
14f40 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
14f50 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
14f60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
14f70 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
14f80 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
14f90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14fa0 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14fb0 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
14fc0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
14fd0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14fe0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14ff0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
15000 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
15010 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
15020 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
15030 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
15040 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
15050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
15060 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
15070 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
15080 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
15090 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
150a0 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
150b0 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
150c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
150d0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
150e0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
150f0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65  urnal, pPager->e
15100 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20  xtraSync);.     
15110 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
15120 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
15130 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
15140 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
15150 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
15160 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
15170 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
15180 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
15190 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
151a0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
151b0 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
151c0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
151d0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
151e0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
151f0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
15200 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
15210 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
15220 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
15230 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l(p);.    }.  }.
15240 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
15250 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
15260 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
15270 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
15280 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
15290 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
152a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
152b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
152c0 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65 72 46   MEMDB || pagerF
152d0 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70 50 61  lushOnCommit(pPa
152e0 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20 29 7b  ger, bCommit) ){
152f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
15300 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
15310 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
15320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15330 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
15340 61 72 57 72 69 74 61 62 6c 65 28 70 50 61 67 65  arWritable(pPage
15350 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
15360 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63   }.    sqlite3Pc
15370 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
15380 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
15390 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
153a0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
153b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
153c0 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
153d0 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c   WAL write-lock,
153e0 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69   if any. Also, i
153f0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
15400 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20   was in .    ** 
15410 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
15420 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20  lusive mode but 
15430 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72  is no longer, dr
15440 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
15450 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65   .    ** lock he
15460 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
15470 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
15480 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
15490 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
154a0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
154b0 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
154c0 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
154d0 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  K );.  }else if(
154e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
154f0 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61  & bCommit && pPa
15500 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
15510 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
15520 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  {.    /* This br
15530 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
15540 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
15550 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72  transaction in r
15560 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a  ollback-journal.
15570 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74      ** mode if t
15580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15590 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67   on disk is larg
155a0 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
155b0 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
155c0 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  ** At this point
155d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
155e0 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
155f0 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
15600 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63  ion .    ** succ
15610 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74  essfully committ
15620 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c  ed, but the EXCL
15630 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74  USIVE lock is st
15640 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  ill held on the.
15650 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
15660 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72  it is safe to tr
15670 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
15680 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20  ase file to its 
15690 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72  minimum.    ** r
156a0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a  equired size.  *
156b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
156c0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
156d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
156e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
156f0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
15700 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
15710 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
15720 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
15730 6d 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  mit ){.    rc = 
15740 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
15750 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
15760 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f   SQLITE_FCNTL_CO
15770 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20 30  MMIT_PHASETWO, 0
15780 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15790 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
157a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
157b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
157c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
157d0 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65  de .   && (!page
157e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
157f0 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  || sqlite3WalExc
15800 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
15810 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29  r->pWal, 0)).  )
15820 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  {.    rc2 = page
15830 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
15840 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
15850 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
15860 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
15870 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65  .  }.  pPager->e
15880 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
15890 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ADER;.  pPager->
158a0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  setMaster = 0;..
158b0 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
158c0 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
158d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
158e0 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
158f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
15900 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
15910 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
15920 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
15930 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
15940 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
15950 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15960 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  e, do not attemp
15970 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  t .** the rollba
15980 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ck at this time.
15990 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f   Instead, pager_
159a0 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c  unlock() is call
159b0 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20  ed. The.** call 
159c0 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
159d0 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61  ) will discard a
159e0 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
159f0 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68  es, unlock.** th
15a00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15a10 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67  and move the pag
15a20 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  er back to OPEN 
15a30 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a  state. If this .
15a40 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
15a50 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75  ere is a hot-jou
15a60 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65  rnal left in the
15a70 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
15a80 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65  e next .** conne
15a90 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
15aa0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
15ab0 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63   the pager (whic
15ac0 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e  h may be this on
15ad0 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c  e) .** will roll
15ae0 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
15af0 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
15b00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
15b10 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
15b20 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
15b30 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
15b40 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
15b50 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
15b60 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
15b70 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
15b80 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
15b90 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
15ba0 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
15bb0 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
15bc0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
15bd0 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
15be0 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
15bf0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
15c00 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
15c10 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
15c20 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15c30 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
15c40 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e  RROR && pPager->
15c50 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
15c60 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  EN ){.    assert
15c70 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
15c80 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
15c90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15ca0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
15cb0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
15cc0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
15cd0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
15ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
15cf0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
15d00 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
15d10 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
15d20 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  c();.    }else i
15d30 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
15d40 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
15d50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15d60 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
15d70 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20  _READER );.     
15d80 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
15d90 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
15da0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
15db0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
15dc0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
15dd0 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
15de0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
15df0 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
15e00 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
15e10 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
15e20 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
15e30 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
15e40 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
15e50 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
15e60 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
15e70 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15e80 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
15e90 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
15ea0 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
15eb0 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
15ec0 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
15ed0 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
15ee0 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
15ef0 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
15f00 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
15f10 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
15f20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
15f30 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
15f40 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
15f50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
15f60 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
15f70 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
15f80 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
15f90 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
15fa0 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
15fb0 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
15fc0 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
15fd0 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
15fe0 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
15ff0 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
16000 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
16010 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
16020 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
16030 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
16040 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
16050 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
16060 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
16070 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
16080 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
16090 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
160a0 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
160b0 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
160c0 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
160d0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
160e0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
160f0 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
16100 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
16110 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
16120 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
16130 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
16140 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
16150 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
16160 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
16170 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
16180 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
16190 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
161a0 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
161b0 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
161c0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
161d0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
161e0 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
161f0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
16200 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
16210 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
16220 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
16230 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
16240 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
16250 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
16260 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
16270 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
16280 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
16290 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
162a0 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
162b0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
162c0 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
162d0 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
162e0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
162f0 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
16300 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
16310 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
16320 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
16330 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
16340 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
16350 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
16360 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
16370 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
163a0 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
163b0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
163c0 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
163d0 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
163e0 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
163f0 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
16400 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   */.#endif..#ifd
16410 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16420 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  DEC./*.** Make s
16430 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
16440 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20  f reserved bits 
16450 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20 74  is the same in t
16460 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a  he destination.*
16470 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69 73  * pager as it is
16480 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e 20   in the source. 
16490 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20 77   This comes up w
164a0 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68 61  hen a VACUUM cha
164b0 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  nges the.** numb
164c0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
164d0 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74 69  its to the "opti
164e0 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a  mal" amount..*/.
164f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
16500 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50 61  rAlignReserve(Pa
16510 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67 65  ger *pDest, Page
16520 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28 20  r *pSrc){.  if( 
16530 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 21  pDest->nReserve!
16540 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 20  =pSrc->nReserve 
16550 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 52  ){.    pDest->nR
16560 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e  eserve = pSrc->n
16570 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
16580 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44 65  erReportSize(pDe
16590 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  st);.  }.}.#endi
165a0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
165b0 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
165c0 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
165d0 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
165e0 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
165f0 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
16600 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
16610 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
16620 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
16630 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
16640 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
16650 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
16660 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
16670 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
16680 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
16690 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
166a0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
166b0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
166c0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
166d0 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
166e0 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
166f0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
16700 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
16710 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
16720 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
16730 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
16740 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
16750 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
16760 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
16770 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
16780 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
16790 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
167a0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
167b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
167c0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
167d0 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
167e0 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
167f0 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
16800 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
16810 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
16820 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
16830 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
16840 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
16850 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
16860 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
16870 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
16880 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
16890 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
168a0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
168b0 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
168c0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
168d0 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
168e0 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
168f0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
16900 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
16910 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
16920 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
16930 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16940 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
16950 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
16960 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16970 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
16980 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
16990 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
169a0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
169b0 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
169c0 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
169d0 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
169e0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
169f0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
16a00 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
16a10 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
16a20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
16a30 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16a40 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
16a50 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
16a60 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
16a70 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
16a80 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
16a90 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
16aa0 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
16ab0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
16ac0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
16ad0 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
16ae0 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
16af0 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
16b00 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
16b10 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
16b20 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
16b30 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
16b40 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
16b50 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
16b60 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
16b70 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
16b80 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
16b90 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
16ba0 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
16bb0 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
16bc0 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
16bd0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
16be0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
16bf0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16c00 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
16c10 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
16c20 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
16c30 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
16c40 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
16c50 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
16c60 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
16c70 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
16c80 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
16c90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16ca0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
16cb0 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
16cc0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
16cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16ce0 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
16cf0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
16d00 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
16d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
16d20 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
16d30 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
16d40 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d60 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
16d70 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
16d80 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
16d90 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
16da0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
16db0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
16dc0 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
16dd0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
16de0 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
16df0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
16e00 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16e10 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
16e20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
16e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16e40 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
16e50 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
16e60 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
16e70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
16e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
16e90 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
16ea0 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
16eb0 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ed0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
16ee0 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
16ef0 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
16f00 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
16f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
16f20 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
16f30 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
16f40 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16f50 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
16f60 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
16f70 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
16f80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
16f90 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fb0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
16fc0 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
16fd0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
16fe0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a  E_HAS_CODEC.  /*
16ff0 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61   The jrnlEnc fla
17000 67 20 69 73 20 74 72 75 65 20 69 66 20 4a 6f 75  g is true if Jou
17010 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f 75 6c  rnal pages shoul
17020 64 20 62 65 20 70 61 73 73 65 64 20 74 68 72 6f  d be passed thro
17030 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64  ugh.  ** the cod
17040 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c 73 65  ec.  It is false
17050 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d   for pure in-mem
17060 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ory journals. */
17070 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e  .  const int jrn
17080 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72  lEnc = (isMainJr
17090 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  nl || pPager->su
170a0 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a  bjInMemory==0);.
170b0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
170c0 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
170d0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
170e0 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
170f0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
17100 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
17110 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
17120 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
17130 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
17140 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
17150 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
17160 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
17170 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
17180 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
17190 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
171a0 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
171b0 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
171c0 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
171d0 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
171e0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
171f0 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
17200 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
17210 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
17220 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
17230 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
17240 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
17250 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
17260 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
17270 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
17280 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65  .  /* Either the
17290 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65   state is greate
172a0 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49  r than PAGER_WRI
172b0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20  TER_CACHEMOD (a 
172c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
172d0 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  * or savepoint r
172e0 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20  ollback done at 
172f0 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74  the request of t
17300 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68  he caller) or th
17310 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74  is is.  ** a hot
17320 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
17330 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f  k. If it is a ho
17340 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
17350 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20  ck, the pager.  
17360 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f  ** is in state O
17370 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e  PEN and holds an
17380 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
17390 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot-journal rol
173a0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20  lback.  ** only 
173b0 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  reads from the m
173c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  ain journal, not
173d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
173e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
173f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
17400 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
17410 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
17420 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
17430 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
17440 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
17450 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
17460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17470 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
17480 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
17490 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e  MOD || isMainJrn
174a0 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  l );..  /* Read 
174b0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
174c0 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
174d0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
174e0 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
174f0 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
17500 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
17510 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
17520 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
17530 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
17540 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
17550 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
17560 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
17570 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
17580 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
17590 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
175a0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
175b0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
175c0 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
175d0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
175e0 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
175f0 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
17600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
17620 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
17630 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
17640 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
17650 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
17660 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
17670 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
17680 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
17690 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
176a0 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
176b0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
176c0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
176d0 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
176e0 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
176f0 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
17700 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
17710 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
17720 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
17730 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
17740 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
17750 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
17760 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
17770 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
17780 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
17790 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
177a0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
177b0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
177c0 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
177d0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
177e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
177f0 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
17800 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
17810 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
17820 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
17830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17840 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
17850 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
17860 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
17870 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
17880 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
17890 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
178a0 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
178b0 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
178c0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
178d0 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
178e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
178f0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
17900 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
17910 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  s page has alrea
17920 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
17930 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e  ack before durin
17940 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
17950 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
17960 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
17970 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
17980 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
17990 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
179a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
179b0 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
179c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
179d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
179e0 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
179f0 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
17a00 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
17a10 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
17a20 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
17a30 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
17a40 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
17a50 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
17a60 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
17a70 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
17a80 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
17a90 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
17aa0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
17ab0 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
17ac0 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
17ad0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
17ae0 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
17af0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
17b00 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
17b10 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
17b20 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
17b30 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
17b40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17b50 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
17b60 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
17b70 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
17b80 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
17b90 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
17ba0 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
17bb0 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
17bc0 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
17bd0 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
17be0 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
17bf0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
17c00 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
17c10 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
17c20 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
17c30 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
17c40 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
17c50 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
17c60 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
17c70 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
17c80 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
17c90 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
17ca0 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
17cb0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
17cc0 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
17cd0 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
17ce0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
17cf0 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
17d00 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
17d10 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
17d20 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
17d30 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
17d40 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
17d50 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
17d60 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
17d70 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
17d80 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
17d90 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
17da0 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
17db0 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
17dc0 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
17dd0 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
17de0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
17df0 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
17e00 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
17e10 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
17e20 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
17e30 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
17e40 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
17e50 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
17e60 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
17e70 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
17e80 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
17e90 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
17ea0 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
17eb0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
17ec0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17ed0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17ee0 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
17ef0 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
17f00 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
17f10 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
17f20 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
17f30 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
17f40 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
17f50 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
17f60 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
17f70 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
17f80 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
17f90 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
17fa0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
17fb0 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
17fc0 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
17fd0 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
17fe0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
17ff0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
18000 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
18010 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
18020 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
18030 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
18040 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
18050 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
18060 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
18070 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
18080 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
18090 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
180a0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
180b0 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
180c0 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
180d0 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
180e0 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
180f0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
18100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
18110 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
18120 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
18130 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
18140 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
18150 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
18160 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
18170 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
18180 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
18190 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
181a0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
181b0 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
181c0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
181d0 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
181e0 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
181f0 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
18200 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
18210 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
18220 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
18230 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
18240 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
18250 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
18260 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
18270 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
18280 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
18290 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
182a0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
182b0 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
182c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
182d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
182e0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
182f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
18300 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
18310 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
18320 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
18330 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
18340 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
18350 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
18360 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
18370 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
18380 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41 47  empFile );.  PAG
18390 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
183a0 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
183b0 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
183c0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
183d0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
183e0 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
183f0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
18400 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
18410 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
18420 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
18430 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
18440 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
18450 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
18460 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
18470 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
18480 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
18490 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
184a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
184b0 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
184c0 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
184d0 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
184e0 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
184f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
18500 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61  ->fd).   && (pPa
18510 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
18520 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
18530 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
18540 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
18550 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20    && isSynced.  
18560 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
18570 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
18580 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18590 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
185a0 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50  !isSavepnt && pP
185b0 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c  g!=0 && (pPg->fl
185c0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
185d0 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  YNC)!=0 );.    a
185e0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
185f0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
18600 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
18610 20 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d 20   data read from 
18620 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
18630 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18640 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  se file..    ** 
18650 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
18660 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20 61 6e  safe even for an
18670 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
18680 61 73 65 20 2d 20 61 73 20 74 68 65 20 64 61 74  ase - as the dat
18690 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 63  a.    ** was enc
186a0 72 79 70 74 65 64 20 62 65 66 6f 72 65 20 69 74  rypted before it
186b0 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
186c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
186d0 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
186e0 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 65      ** is if the
186f0 20 64 61 74 61 20 77 61 73 20 6a 75 73 74 20 72   data was just r
18700 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d  ead from an in-m
18710 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
18720 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20 20 2a  l. In that.    *
18730 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74 20 62  * case it must b
18740 65 20 65 6e 63 72 79 70 74 65 64 20 68 65 72 65  e encrypted here
18750 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 63 6f   before it is co
18760 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61  pied into the da
18770 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
18780 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  le.  */.#ifdef S
18790 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
187a0 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63      if( !jrnlEnc
187b0 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 32   ){.      CODEC2
187c0 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
187d0 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
187e0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61  TE_NOMEM_BKPT, a
187f0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 63 20  Data);.      rc 
18800 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
18810 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
18820 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
18830 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
18840 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  );.      CODEC1(
18850 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
18860 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18870 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
18880 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
18890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
188a0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
188b0 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
188c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
188d0 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69  e, ofst);..    i
188e0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
188f0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
18900 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
18910 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
18920 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
18930 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
18940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
18950 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 69 66  S_CODEC.      if
18960 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20  ( jrnlEnc ){.   
18970 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
18980 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
18990 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
189a0 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20  MEM_BKPT);.     
189b0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
189c0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
189d0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
189e0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
189f0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
18a00 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
18a10 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18a20 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20  M_BKPT,aData);. 
18a30 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
18a40 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  f.      sqlite3B
18a50 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
18a60 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
18a70 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
18a80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
18a90 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
18aa0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
18ab0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
18ac0 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
18ad0 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
18ae0 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
18af0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
18b00 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
18b10 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
18b20 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
18b30 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
18b40 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
18b50 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
18b60 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
18b70 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
18b80 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
18b90 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
18ba0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
18bb0 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
18bc0 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
18bd0 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
18be0 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
18bf0 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
18c00 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
18c10 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
18c20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
18c30 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
18c40 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
18c50 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
18c60 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
18c70 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
18c80 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
18c90 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
18ca0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
18cb0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
18cc0 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
18cd0 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
18ce0 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
18cf0 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
18d00 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
18d10 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
18d20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
18d30 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
18d40 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
18d50 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
18d60 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
18d70 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
18d80 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
18d90 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
18da0 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
18db0 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
18dc0 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
18dd0 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
18de0 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
18df0 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
18e00 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
18e10 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
18e20 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
18e30 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
18e40 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
18e50 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18e60 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ACK)==0 );.    p
18e70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18e80 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52  l |= SPILLFLAG_R
18e90 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20  OLLBACK;.    rc 
18ea0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
18eb0 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
18ec0 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73  &pPg, 1);.    as
18ed0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
18ee0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
18ef0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21  LFLAG_ROLLBACK)!
18f00 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
18f10 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
18f20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  ~SPILLFLAG_ROLLB
18f30 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ACK;.    if( rc!
18f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18f50 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
18f60 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
18f70 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
18f80 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
18f90 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
18fa0 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
18fb0 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
18fc0 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
18fd0 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
18fe0 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
18ff0 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
19000 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
19010 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
19020 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
19030 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
19040 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
19050 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
19060 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
19070 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
19080 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
19090 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
190a0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
190b0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
190c0 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
190d0 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
190e0 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
190f0 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
19100 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
19110 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
19120 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
19130 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
19140 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73 65  );.    /* It use
19150 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71 6c  d to be that sql
19160 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
19170 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61 6c  ean(pPg) was cal
19180 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a 20  led here.  But. 
19190 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20     ** that call 
191a0 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61 6e  was dangerous an
191b0 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74 61  d had no detecta
191c0 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e 63  ble benefit sinc
191d0 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20 20  e the cache.    
191e0 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  ** is normally c
191f0 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74 65  leaned by sqlite
19200 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
19210 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  ) after rollback
19220 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68   and so.    ** h
19230 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  as been removed.
19240 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73 65   */.    pager_se
19250 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
19260 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
19270 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
19280 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
19290 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
192a0 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
192b0 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
192c0 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
192d0 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
192e0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
192f0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
19300 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
19310 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
19320 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
19330 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
19340 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
19350 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
19360 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c   disk */.#if SQL
19370 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
19380 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b    if( jrnlEnc ){
19390 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
193a0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
193b0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
193c0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65  OMEM_BKPT); }.#e
193d0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
193e0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
193f0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
19400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
19410 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
19420 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
19430 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19440 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
19450 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
19460 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
19470 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19480 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
19490 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
194a0 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
194b0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
194c0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
194d0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
194e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
194f0 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
19500 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
19510 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
19520 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
19530 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
19540 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
19550 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
19560 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
19570 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
19580 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
19590 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
195a0 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
195b0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
195c0 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
195d0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
195e0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
195f0 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
19600 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
19610 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
19620 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
19630 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
19640 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
19650 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
19660 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
19670 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
19680 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
19690 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
196a0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
196b0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
196c0 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
196d0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
196e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
196f0 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
19700 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
19710 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
19720 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
19730 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
19740 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
19750 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
19760 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
19770 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
19780 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19790 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
197a0 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
197b0 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
197c0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
197d0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
197e0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
197f0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
19800 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
19810 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
19820 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
19830 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
19840 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
19850 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
19860 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
19870 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
19880 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
19890 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
198a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
198b0 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
198c0 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
198d0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
198e0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
198f0 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
19900 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
19910 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
19920 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
19930 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
19940 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
19950 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
19960 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
19970 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
19980 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
19990 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
199a0 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
199b0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
199c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
199d0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
199e0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
199f0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
19a00 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
19a10 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
19a20 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
19a30 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
19a40 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
19a50 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
19a60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
19a70 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19a80 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
19a90 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
19aa0 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
19ab0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
19ac0 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
19ad0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
19ae0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
19af0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
19b00 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
19b10 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
19b20 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19b30 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
19b40 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
19b50 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
19b60 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
19b70 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
19b80 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
19b90 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
19ba0 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
19bb0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
19bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
19bd0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
19be0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
19bf0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
19c00 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19c10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
19c20 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
19c30 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
19c40 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
19c50 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
19c60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19c70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
19c80 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
19c90 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
19ca0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
19cb0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
19cc0 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
19cd0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
19ce0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
19cf0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19d00 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
19d10 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
19d20 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
19d30 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
19d40 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
19d50 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
19d60 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
19d70 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
19d80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
19d90 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
19da0 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
19db0 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
19dc0 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
19dd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
19de0 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
19df0 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
19e00 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
19e10 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
19e20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
19e30 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
19e40 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
19e50 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
19e60 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
19e70 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
19e80 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
19e90 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
19ea0 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
19eb0 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
19ec0 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
19ed0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
19ee0 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
19ef0 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
19f00 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
19f10 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
19f20 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
19f30 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
19f40 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19f50 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
19f60 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
19f70 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
19f80 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
19f90 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
19fa0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
19fb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19fc0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
19fd0 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
19fe0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
19ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a000 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
1a010 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
1a020 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
1a030 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a040 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
1a050 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
1a060 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
1a070 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
1a080 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
1a090 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
1a0a0 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
1a0b0 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
1a0c0 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
1a0d0 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
1a0e0 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
1a0f0 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
1a100 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
1a110 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
1a120 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1a130 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
1a140 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
1a150 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
1a160 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1a170 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a180 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
1a190 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
1a1a0 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
1a1b0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
1a1c0 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
1a1d0 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
1a1e0 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
1a1f0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
1a200 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a210 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1a220 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a230 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
1a240 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
1a250 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
1a260 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
1a270 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1a280 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
1a290 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
1a2a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
1a2b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a2c0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
1a2d0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
1a2e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
1a2f0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
1a300 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
1a310 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
1a320 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
1a330 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
1a340 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
1a350 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
1a360 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
1a370 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1a380 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
1a390 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1a3a0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
1a3b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a3c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
1a3d0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a3e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a3f0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
1a400 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
1a410 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
1a420 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
1a430 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
1a440 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
1a450 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
1a460 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
1a470 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
1a480 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
1a490 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
1a4a0 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
1a4b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
1a4c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1a4d0 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
1a4e0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
1a4f0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
1a500 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1a510 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
1a520 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1a530 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
1a540 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
1a550 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
1a560 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a570 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
1a580 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a590 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
1a5a0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1a5b0 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
1a5c0 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
1a5d0 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
1a5e0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
1a5f0 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
1a600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a610 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
1a620 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a630 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
1a640 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
1a650 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
1a660 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
1a670 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
1a680 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
1a690 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
1a6a0 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
1a6b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a6c0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
1a6d0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a6e0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1a6f0 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
1a700 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
1a710 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
1a720 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
1a730 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
1a740 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
1a750 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
1a760 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
1a770 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
1a780 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
1a790 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
1a7a0 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
1a7b0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
1a7c0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
1a7d0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
1a7e0 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
1a7f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
1a800 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
1a810 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1a820 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a830 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
1a840 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
1a850 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1a860 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
1a870 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
1a880 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1a890 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
1a8a0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
1a8b0 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
1a8c0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1a8d0 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
1a8e0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
1a8f0 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
1a900 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
1a910 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1a920 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
1a930 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
1a940 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
1a950 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
1a960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1a970 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
1a980 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
1a990 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
1a9a0 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
1a9b0 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
1a9c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1a9d0 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
1a9e0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
1a9f0 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
1aa00 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
1aa10 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
1aa20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
1aa30 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
1aa40 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
1aa50 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  Or, it might be 
1aa60 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
1aa70 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
1aa80 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
1aa90 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
1aaa0 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
1aab0 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
1aac0 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
1aad0 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
1aae0 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
1aaf0 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
1ab00 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
1ab10 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
1ab20 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
1ab30 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
1ab40 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
1ab50 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
1ab60 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
1ab70 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
1ab80 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
1ab90 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1aba0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
1abb0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1abc0 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
1abd0 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
1abe0 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
1abf0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
1ac00 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1ac10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ac20 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
1ac30 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1ac40 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
1ac50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ac60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ac70 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
1ac80 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
1ac90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1aca0 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
1acb0 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
1acc0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
1acd0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1ace0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1acf0 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1ad00 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1ad10 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
1ad20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
1ad30 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
1ad40 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
1ad50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1ad60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1ad70 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
1ad80 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
1ad90 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
1ada0 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
1adb0 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
1adc0 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
1add0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1ade0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
1adf0 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
1ae00 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a  ewSize = szPage*
1ae10 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
1ae20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ae30 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
1ae40 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
1ae50 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
1ae60 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
1ae70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ae80 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
1ae90 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
1aea0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1aeb0 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b  f( (currentSize+
1aec0 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65  szPage)<=newSize
1aed0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1aee0 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d   *pTmp = pPager-
1aef0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1af00 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c      memset(pTmp,
1af10 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20   0, szPage);.   
1af20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1af30 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
1af40 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  == currentSize )
1af50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1af60 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
1af70 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53  age) >  currentS
1af80 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ize );.        r
1af90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1afa0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
1afb0 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77  Tmp, szPage, new
1afc0 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20  Size-szPage);.  
1afd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1afe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1aff0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b000 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
1b010 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
1b020 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1b040 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20  urn a sanitized 
1b050 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
1b060 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53  ector-size of OS
1b070 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65   file pFile. The
1b080 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1b090 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1b0a0 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32  o lie between 32
1b0b0 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f   and MAX_SECTOR_
1b0c0 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  SIZE..*/.int sql
1b0d0 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73  ite3SectorSize(s
1b0e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1b0f0 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20  le){.  int iRet 
1b100 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
1b110 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20  rSize(pFile);.  
1b120 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20  if( iRet<32 ){. 
1b130 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20     iRet = 512;. 
1b140 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e   }else if( iRet>
1b150 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1b160 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
1b170 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
1b180 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20  512 );.    iRet 
1b190 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
1b1a0 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
1b1b0 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  iRet;.}../*.** S
1b1c0 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1b1d0 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
1b1e0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
1b1f0 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
1b200 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
1b210 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1b220 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1b230 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
1b240 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1b250 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
1b260 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1b270 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
1b280 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1b290 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
1b2a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b2b0 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
1b2c0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
1b2d0 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
1b2e0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1b2f0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
1b300 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
1b310 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1b320 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
1b330 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
1b340 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
1b350 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
1b360 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b370 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
1b380 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1b390 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1b3a0 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
1b3b0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
1b3c0 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
1b3d0 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
1b3e0 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
1b3f0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
1b400 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
1b410 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
1b420 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  R_SIZE..**.** If
1b430 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68   the file has th
1b440 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  e SQLITE_IOCAP_P
1b450 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b460 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  TE property, the
1b470 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66  n set.** the eff
1b480 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1b490 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  ze to its minimu
1b4a0 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20  m value (512).  
1b4b0 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a  The purpose of.*
1b4c0 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  * pPager->sector
1b4d0 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e  Size is to defin
1b4e0 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64  e the "blast rad
1b4f0 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68  ius" of bytes th
1b500 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1b510 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63  ge if a crash oc
1b520 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69  curs while writi
1b530 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62  ng to a single b
1b540 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72  yte in.** that r
1b550 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20  ange.  But with 
1b560 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1b570 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72  ITE, the blast r
1b580 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a  adius is zero.**
1b590 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50   (that is what P
1b5a0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b5b0 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65  TE means), so we
1b5c0 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65   minimize the se
1b5d0 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46  ctor.** size.  F
1b5e0 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
1b5f0 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68  patibility of th
1b600 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1b610 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a  al file format,.
1b620 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64  ** we cannot red
1b630 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
1b640 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65  e sector size be
1b650 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74  low 512..*/.stat
1b660 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
1b670 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
1b680 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
1b690 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1b6a0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1b6b0 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
1b6c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1b6d0 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  e.   || (sqlite3
1b6e0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1b6f0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1b700 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20  fd) & .         
1b710 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1b720 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1b730 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20  WRITE)!=0.  ){. 
1b740 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
1b750 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
1b760 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1b770 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
1b780 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
1b790 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
1b7a0 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
1b7b0 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
1b7c0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
1b7d0 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
1b7e0 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ault. */.    pPa
1b7f0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b800 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 512;.  }else{.
1b810 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1b820 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
1b830 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1b840 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r->fd);.  }.}../
1b850 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
1b860 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
1b870 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
1b880 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
1b890 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
1b8a0 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
1b8b0 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
1b8c0 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
1b8d0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b8e0 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
1b8f0 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
1b900 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
1b910 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
1b920 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
1b930 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
1b940 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1b950 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1b960 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
1b970 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
1b980 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
1b990 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
1b9a0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1b9b0 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
1b9c0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
1b9d0 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
1b9e0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
1b9f0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
1ba00 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
1ba10 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1ba20 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
1ba30 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
1ba40 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
1ba50 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
1ba60 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
1ba70 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1ba80 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1ba90 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
1baa0 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
1bab0 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
1bac0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
1bad0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1bae0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1baf0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
1bb00 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
1bb10 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
1bb20 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
1bb30 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
1bb40 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1bb50 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1bb60 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
1bb70 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
1bb80 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
1bb90 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
1bba0 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
1bbb0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
1bbc0 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
1bbd0 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
1bbe0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1bbf0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
1bc00 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
1bc10 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1bc20 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
1bc30 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1bc40 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
1bc50 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
1bc60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1bc70 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
1bc80 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
1bc90 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
1bca0 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
1bcb0 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
1bcc0 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
1bcd0 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
1bce0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
1bcf0 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
1bd00 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
1bd10 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1bd20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
1bd30 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
1bd40 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
1bd50 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
1bd60 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
1bd70 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
1bd80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1bd90 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
1bda0 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
1bdb0 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
1bdc0 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
1bdd0 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
1bde0 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
1bdf0 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
1be00 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1be10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1be20 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
1be30 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
1be40 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
1be50 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
1be60 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
1be70 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
1be80 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
1be90 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
1bea0 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
1beb0 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
1bec0 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
1bed0 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
1bee0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
1bef0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1bf00 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1bf10 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
1bf20 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1bf30 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
1bf40 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
1bf50 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
1bf60 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
1bf70 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
1bf80 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
1bf90 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
1bfa0 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
1bfb0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
1bfc0 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
1bfd0 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
1bfe0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
1bff0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
1c000 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
1c010 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1c020 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
1c030 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
1c040 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
1c050 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
1c060 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
1c070 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1c080 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
1c090 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
1c0a0 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
1c0b0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
1c0c0 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
1c0d0 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
1c0e0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
1c0f0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
1c100 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
1c110 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1c120 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
1c130 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1c140 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
1c150 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1c160 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
1c170 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
1c180 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
1c190 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
1c1a0 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
1c1b0 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
1c1c0 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
1c1d0 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
1c1e0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
1c1f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1c200 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
1c210 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
1c220 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1c230 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
1c240 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
1c250 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
1c260 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
1c270 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
1c280 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
1c290 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
1c2a0 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
1c2b0 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
1c2c0 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
1c2d0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
1c2e0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c2f0 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
1c300 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
1c310 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
1c320 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
1c330 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
1c340 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
1c350 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
1c360 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
1c370 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
1c380 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
1c390 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1c3a0 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
1c3b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c3c0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1c3d0 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3f0 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
1c400 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
1c410 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
1c440 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
1c450 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1c480 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1c490 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
1c4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1c4b0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1c4c0 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
1c4d0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4f0 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
1c500 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1c510 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
1c520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1c530 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1c540 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
1c550 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
1c560 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
1c570 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
1c580 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1c590 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
1c5a0 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
1c5b0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
1c5c0 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
1c5d0 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
1c5e0 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e  lback */.  int n
1c5f0 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20  Playback = 0;   
1c600 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1c610 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73  ber of pages res
1c620 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e  tored from journ
1c630 61 6c 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  al */.  u32 save
1c640 64 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  dPageSize = pPag
1c650 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
1c660 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1c670 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
1c680 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
1c690 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
1c6a0 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
1c6b0 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
1c6c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
1c6d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1c6e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
1c6f0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1c700 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
1c710 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1c730 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1c740 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
1c750 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1c760 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
1c770 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
1c780 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
1c790 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1c7a0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
1c7b0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
1c7c0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
1c7d0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
1c7e0 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
1c7f0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
1c800 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
1c810 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
1c820 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
1c830 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
1c840 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
1c850 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
1c860 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
1c870 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
1c880 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
1c890 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
1c8a0 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
1c8b0 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
1c8c0 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
1c8d0 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
1c8e0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1c8f0 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
1c900 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
1c910 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
1c920 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
1c930 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
1c940 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
1c950 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
1c960 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
1c970 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1c980 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
1c990 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1c9a0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1c9b0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1c9c0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1c9d0 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
1c9e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1c9f0 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
1ca00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1ca10 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
1ca20 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
1ca30 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
1ca40 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
1ca50 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
1ca60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
1ca70 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1ca80 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
1ca90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1caa0 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
1cab0 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
1cac0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
1cad0 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
1cae0 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
1caf0 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
1cb00 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
1cb10 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
1cb20 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
1cb30 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
1cb40 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
1cb50 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
1cb60 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
1cb70 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
1cb80 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
1cb90 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
1cba0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
1cbb0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
1cbc0 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
1cbd0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1cbe0 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
1cbf0 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
1cc00 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
1cc10 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
1cc20 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61  ess must have fa
1cc30 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
1cc40 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
1cc50 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
1cc60 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
1cc70 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1cc80 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
1cc90 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
1cca0 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
1ccb0 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
1ccc0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1ccd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
1cce0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ccf0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1cd00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cd10 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1cd20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1cd30 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
1cd40 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
1cd50 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
1cd60 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
1cd70 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1cd80 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
1cd90 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1cda0 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
1cdb0 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
1cdc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1cdd0 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
1cde0 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
1cdf0 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
1ce00 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
1ce10 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
1ce20 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1ce30 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
1ce40 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
1ce50 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1ce60 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
1ce70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1ce80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1ce90 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1cea0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
1ceb0 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1cec0 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
1ced0 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
1cee0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1cef0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1cf00 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
1cf10 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
1cf20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
1cf30 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
1cf40 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1cf50 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
1cf60 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
1cf70 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
1cf80 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
1cf90 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
1cfa0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
1cfb0 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1cfc0 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
1cfd0 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
1cfe0 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
1cff0 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
1d000 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1d010 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
1d020 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
1d030 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
1d040 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1d050 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
1d060 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
1d070 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
1d080 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
1d090 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
1d0a0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
1d0b0 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
1d0c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
1d0d0 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
1d0e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
1d0f0 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
1d100 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
1d110 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
1d120 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
1d130 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
1d140 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
1d150 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
1d160 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
1d170 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
1d180 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1d190 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
1d1a0 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
1d1b0 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
1d1c0 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1d1d0 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1d1e0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1d1f0 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
1d200 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
1d210 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
1d220 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
1d230 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1d240 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
1d250 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1d260 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
1d270 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1d280 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
1d290 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
1d2a0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1d2b0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
1d2c0 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
1d2d0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1d2e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d2f0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1d300 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
1d310 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1d320 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1d330 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1d340 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
1d350 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
1d360 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1d370 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1d380 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1d390 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1d3a0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
1d3b0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
1d3c0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1d3d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d3e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1d3f0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1d400 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1d410 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
1d420 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
1d430 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
1d440 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
1d450 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
1d460 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
1d470 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
1d480 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
1d490 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
1d4a0 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
1d4b0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
1d4c0 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
1d4d0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
1d4e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d4f0 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1d500 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d510 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1d520 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1d530 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
1d540 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
1d550 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1d560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d570 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1d580 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
1d590 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1d5a0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1d5b0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1d5c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
1d5d0 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
1d5e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1d5f0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1d600 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1d610 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1d620 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1d630 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63  l has been trunc
1d640 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f  ated, simply sto
1d650 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20  p reading and.  
1d660 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1d670 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ssing the journa
1d680 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  l. This might ha
1d690 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72  ppen if the jour
1d6a0 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  nal was.        
1d6b0 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74    ** not complet
1d6c0 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20  ely written and 
1d6d0 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20  synced prior to 
1d6e0 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61  a crash.  In tha
1d6f0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1d700 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ase, the databas
1d710 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65  e should have ne
1d720 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
1d730 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1d740 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65    ** first place
1d750 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20   so it is OK to 
1d760 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74  simply abandon t
1d770 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  he rollback. */.
1d780 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1d790 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1d7a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1d7b0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1d7c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d7d0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
1d7e0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
1d7f0 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e   quit and return
1d800 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   the error.     
1d810 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54       ** code.  T
1d820 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
1d830 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
1d840 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
1d850 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1d860 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65  o that no furthe
1d870 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64  r harm will be d
1d880 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68  one.  Perhaps th
1d890 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20  e next.         
1d8a0 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63   ** process to c
1d8b0 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62  ome along will b
1d8c0 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
1d8d0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
1d8e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1d8f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1d900 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1d910 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d920 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
1d930 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
1d940 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
1d950 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
1d960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d980 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
1d990 61 67 65 72 2c 20 26 73 61 76 65 64 50 61 67 65  ager, &savedPage
1d9a0 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20  Size, -1);.  }. 
1d9b0 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1d9c0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1d9d0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1d9e0 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1d9f0 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1da00 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1da10 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1da20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1da30 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1da40 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1da50 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1da60 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1da70 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1da80 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1da90 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1daa0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1dab0 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64  ified..  */.#ifd
1dac0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1dad0 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1dae0 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
1daf0 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
1db00 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
1db10 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  0);.#endif..  /*
1db20 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
1db30 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
1db40 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
1db50 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
1db60 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
1db70 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
1db80 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
1db90 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
1dba0 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
1dbb0 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
1dbc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1dbd0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1dbe0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1dbf0 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
1dc00 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
1dc10 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
1dc20 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
1dc30 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
1dc40 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
1dc50 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
1dc60 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
1dc70 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
1dc80 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
1dc90 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
1dca0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1dcb0 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
1dcc0 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
1dcd0 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
1dce0 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
1dcf0 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
1dd00 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
1dd10 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
1dd20 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
1dd30 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
1dd40 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
1dd50 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
1dd60 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
1dd70 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1dd80 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
1dd90 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
1dda0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ddb0 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
1ddc0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1ddd0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
1dde0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1ddf0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1de00 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1de10 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1de20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1de30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1de40 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1de50 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50  ITE_OK.   && (pP
1de60 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1de70 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1de80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1de90 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
1dea0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
1deb0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
1dec0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
1ded0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dee0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
1def0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1df00 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
1df10 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30  ster[0]!='\0', 0
1df20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1df30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1df40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1df50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1df60 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
1df70 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1df80 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
1df90 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
1dfa0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
1dfb0 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
1dfc0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1dfd0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
1dfe0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
1dff0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
1e000 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
1e010 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
1e020 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
1e030 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1e040 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1e050 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61  f( isHot && nPla
1e060 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  yback ){.    sql
1e070 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1e080 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
1e090 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65  OLLBACK, "recove
1e0a0 72 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f  red %d pages fro
1e0b0 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  m %s",.         
1e0c0 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1e0d0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1e0e0 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  al);.  }..  /* T
1e0f0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1e100 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
1e110 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
1e120 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
1e130 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
1e140 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
1e150 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
1e160 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
1e170 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
1e180 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
1e190 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1e1a0 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
1e1b0 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
1e1c0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1e1d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e1e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1e1f0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
1e200 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
1e210 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1e220 6f 72 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65  or out of.** the
1e230 20 57 41 4c 20 69 66 20 74 68 61 74 20 69 73 20   WAL if that is 
1e240 77 68 65 72 65 20 74 68 65 20 6d 6f 73 74 20 72  where the most r
1e250 65 63 65 6e 74 20 63 6f 70 79 20 69 66 20 66 6f  ecent copy if fo
1e260 75 6e 64 29 20 69 6e 74 6f 20 0a 2a 2a 20 70 50  und) into .** pP
1e270 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1e280 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1e290 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1e2a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1e2b0 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1e2c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e2d0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1e2e0 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1e2f0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1e300 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1e310 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1e320 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1e330 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1e340 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1e350 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1e360 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1e370 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1e380 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1e390 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1e3a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1e3b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1e3c0 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1e3d0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1e3e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e3f0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1e400 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1e410 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1e420 67 65 20 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20  ge pPg */.  int 
1e430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e440 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e450 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 6e  rn code */..#ifn
1e460 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e470 57 41 4c 0a 20 20 75 33 32 20 69 46 72 61 6d 65  WAL.  u32 iFrame
1e480 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e490 20 20 20 2f 2a 20 46 72 61 6d 65 20 6f 66 20 57     /* Frame of W
1e4a0 41 4c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 67  AL containing pg
1e4b0 6e 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  no */..  assert(
1e4c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1e4d0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
1e4e0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1e4f0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1e500 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66  er->fd) );..  if
1e510 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1e520 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
1e530 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1e540 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e550 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1e560 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  iFrame);.    if(
1e570 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1e580 0a 20 20 7d 0a 20 20 69 66 28 20 69 46 72 61 6d  .  }.  if( iFram
1e590 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  e ){.    rc = sq
1e5a0 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d  lite3WalReadFram
1e5b0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1e5c0 69 46 72 61 6d 65 2c 70 50 61 67 65 72 2d 3e 70  iFrame,pPager->p
1e5d0 61 67 65 53 69 7a 65 2c 70 50 67 2d 3e 70 44 61  ageSize,pPg->pDa
1e5e0 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ta);.  }else.#en
1e5f0 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  dif.  {.    i64 
1e600 69 4f 66 66 73 65 74 20 3d 20 28 70 50 67 2d 3e  iOffset = (pPg->
1e610 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1e620 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1e630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1e640 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1e650 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
1e660 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1e670 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
1e680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1e690 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1e6a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e6b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1e6c0 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  ..  if( pPg->pgn
1e6d0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1e6e0 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1e6f0 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1e700 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1e710 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1e720 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1e730 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1e740 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1e750 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1e760 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1e770 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1e780 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1e790 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e7a0 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1e7b0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1e7c0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1e7d0 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1e7e0 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1e7f0 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1e800 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1e810 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1e820 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1e830 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1e840 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1e850 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1e860 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1e870 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1e880 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1e890 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1e8a0 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1e8b0 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1e8c0 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1e8d0 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1e8e0 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1e8f0 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1e900 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1e910 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1e920 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1e930 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1e940 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20   noise equaling 
1e950 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66  16 bytes of 0xff
1e960 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20   is vanishingly 
1e970 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a  small so.      *
1e980 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c  * we should stil
1e990 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a  l be ok..      *
1e9a0 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  /.      memset(p
1e9b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e9c0 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28  s, 0xff, sizeof(
1e9d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e9e0 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rs));.    }else{
1e9f0 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c  .      u8 *dbFil
1ea00 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
1ea10 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
1ea20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1ea30 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ea40 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1ea50 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1ea60 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1ea70 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1ea80 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
1ea90 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
1eaa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1eab0 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45  M_BKPT);..  PAGE
1eac0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1ead0 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1eae0 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1eaf0 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1eb00 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1eb10 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1eb20 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  er, pPg->pgno));
1eb30 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1eb40 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1eb50 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1eb70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1eb80 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  pPg->pgno, pager
1eb90 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1eba0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1ebb0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1ebc0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1ebd0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ebe0 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e  at offsets 24 an
1ebf0 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68  d 92 in.** the h
1ec00 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71  eader and the sq
1ec10 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  lite version num
1ec20 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
1ec30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1ec40 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  an unconditional
1ec50 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c   update.  See al
1ec60 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63  so the pager_inc
1ec70 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1ec80 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69  ).** routine whi
1ec90 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20  ch only updates 
1eca0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1ecb0 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65  er if the update
1ecc0 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20   is actually.** 
1ecd0 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72  needed, as deter
1ece0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61  mined by the pPa
1ecf0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1ed00 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61  Done state varia
1ed10 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1ed20 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f  oid pager_write_
1ed30 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67  changecounter(Pg
1ed40 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32  Hdr *pPg){.  u32
1ed50 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1ed60 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1ed70 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
1ed80 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
1ed90 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
1eda0 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63  4. */.  change_c
1edb0 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
1edc0 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
1edd0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  g->pPager->dbFil
1ede0 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33  eVers)+1;.  put3
1edf0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1ee00 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  g->pData)+24, ch
1ee10 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
1ee20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
1ee30 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
1ee40 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
1ee50 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
1ee60 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e  .  ** bytes 92..
1ee70 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61  95 store the cha
1ee80 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge counter for 
1ee90 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f  which the versio
1eea0 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73  n number.  ** is
1eeb0 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74   valid. */.  put
1eec0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1eed0 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63  Pg->pData)+92, c
1eee0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1eef0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1ef00 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1ef10 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49  96, SQLITE_VERSI
1ef20 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23  ON_NUMBER);.}..#
1ef30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ef40 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_WAL./*.** Thi
1ef50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
1ef60 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  voked once for e
1ef70 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61  ach page that ha
1ef80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a  s already been .
1ef90 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
1efa0 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65  the log file whe
1efb0 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  n a WAL transact
1efc0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1efd0 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ck..** Parameter
1efe0 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65   iPg is the page
1eff0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20   number of said 
1f000 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61  page. The pCtx a
1f010 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61  rgument .** is a
1f020 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
1f030 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1f040 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
1f050 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70  If page iPg is p
1f060 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61  resent in the ca
1f070 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20  che, and has no 
1f080 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1f090 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73  rences,.** it is
1f0a0 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65   discarded. Othe
1f0b0 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
1f0c0 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
1f0d0 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72  outstanding.** r
1f0e0 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70  eferences, the p
1f0f0 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72  age content is r
1f100 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65  eloaded from the
1f110 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
1f120 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  e.** attempt to 
1f130 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66  reload content f
1f140 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1f150 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64   is required and
1f160 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75   fails, .** retu
1f170 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
1f180 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
1f190 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
1f1a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f1b0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76  erUndoCallback(v
1f1c0 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20  oid *pCtx, Pgno 
1f1d0 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  iPg){.  int rc =
1f1e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1f1f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1f200 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50  ager *)pCtx;.  P
1f210 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
1f220 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1f230 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  l(pPager) );.  p
1f240 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1f250 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1f260 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1f270 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1f280 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1f290 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1f2a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1f2b0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1f2c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1f2d0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1f2e0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1f2f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f300 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f310 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1f320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1f330 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
1f340 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20  otNull(pPg);.   
1f350 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1f360 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1f370 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1f380 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1f390 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1f3a0 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1f3b0 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1f3c0 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1f3d0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1f3e0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1f3f0 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1f400 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1f410 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1f420 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1f430 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1f440 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1f450 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1f460 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1f470 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1f480 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1f490 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1f4a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1f4b0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1f4c0 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1f4d0 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1f4e0 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1f4f0 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1f500 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1f510 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1f520 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1f530 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1f540 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1f550 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1f560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f570 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f580 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1f590 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1f5a0 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1f5b0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1f5c0 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1f5d0 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1f5e0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f610 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1f620 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f640 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1f650 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1f660 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1f670 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1f680 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1f690 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1f6a0 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1f6b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1f6c0 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1f6d0 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1f6e0 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1f6f0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1f700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1f710 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1f720 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1f730 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1f740 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1f750 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1f760 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1f770 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1f780 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1f790 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1f7a0 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1f7b0 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1f7c0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1f7d0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1f7e0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1f7f0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1f800 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1f810 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f820 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1f830 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1f840 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1f850 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1f860 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1f870 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1f880 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1f890 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1f8a0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1f8b0 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1f8c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f8d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f8e0 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1f8f0 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1f900 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1f910 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1f920 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1f930 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1f940 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1f950 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1f960 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1f970 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1f980 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1f990 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1f9a0 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1f9b0 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1f9c0 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1f9d0 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1f9e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1f9f0 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1fa00 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1fa10 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1fa20 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1fa30 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1fa40 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1fa50 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1fa60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1fa70 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1fa80 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1fa90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1faa0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1fab0 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1fae0 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1faf0 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb10 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1fb20 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1fb30 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1fb40 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1fb50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1fb60 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1fb70 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1fb80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1fba0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1fbb0 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fbd0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1fbe0 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50   in pList */.  P
1fbf0 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fc10 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1fc20 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61  er pages */..  a
1fc30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1fc40 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1fc50 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1fc60 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1fc70 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1fc80 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1fc90 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1fca0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1fcb0 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1fcc0 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1fcd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1fce0 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1fcf0 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1fd00 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1fd10 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1fd20 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1fd30 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1fd40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1fd50 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1fd60 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1fd70 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1fd80 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1fd90 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1fda0 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1fdb0 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1fdc0 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1fdd0 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1fde0 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1fdf0 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1fe00 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1fe10 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1fe20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1fe30 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1fe40 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65      PgHdr **ppNe
1fe50 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20  xt = &pList;.   
1fe60 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
1fe70 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70  for(p=pList; (*p
1fe80 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70  pNext = p)!=0; p
1fe90 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1fea0 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d     if( p->pgno<=
1feb0 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  nTruncate ){.   
1fec0 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70       ppNext = &p
1fed0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
1fee0 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20    nList++;.     
1fef0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1ff00 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20  ert( pList );.  
1ff10 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74  }else{.    nList
1ff20 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 1;.  }.  pPag
1ff30 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
1ff40 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e  STAT_WRITE] += n
1ff50 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69  List;..  if( pLi
1ff60 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
1ff70 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1ff80 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
1ff90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1ffa0 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e  lFrames(pPager->
1ffb0 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61  pWal, .      pPa
1ffc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
1ffd0 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c  List, nTruncate,
1ffe0 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65   isCommit, pPage
1fff0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  r->walSyncFlags.
20000 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
20010 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
20020 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
20030 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
20040 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
20050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
20060 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
20070 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70  r->pBackup, p->p
20080 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44  gno, (u8 *)p->pD
20090 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
200a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
200b0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69  HECK_PAGES.  pLi
200c0 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
200d0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
200e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
200f0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
20100 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
20110 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
20120 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e  hash(p);.  }.#en
20130 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
20140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
20150 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
20160 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a  ion on the WAL..
20170 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20180 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61  ne used to be ca
20190 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53  lled "pagerOpenS
201a0 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75  napshot()" becau
201b0 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c  se it essentiall
201c0 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61  y.** makes a sna
201d0 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74  pshot of the dat
201e0 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72  abase at the cur
201f0 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69  rent point in ti
20200 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73  me and preserves
20210 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f  .** that snapsho
20220 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
20230 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65   reader in spite
20240 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79   of concurrently
20250 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f   changes by.** o
20260 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20  ther writers or 
20270 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a  checkpointers..*
20280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
20290 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
202a0 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
202b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
202e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
202f0 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20   changed = 0;   
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20310 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75  True if cache mu
20320 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a  st be reset */..
20330 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
20340 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
20350 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20360 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
20370 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
20380 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
20390 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73  EADER );..  /* s
203a0 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
203b0 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61  Transaction() wa
203c0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72  s not called for
203d0 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20   the previous.  
203e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
203f0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
20400 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61  XCLUSIVE.  So ca
20410 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77  ll it now.  If w
20420 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f  e.  ** are in lo
20430 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41  cking_mode=NORMA
20440 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20  L and EndRead() 
20450 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  was previously c
20460 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  alled,.  ** the 
20470 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69  duplicate call i
20480 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  s harmless..  */
20490 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  .  sqlite3WalEnd
204a0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
204b0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
204c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
204d0 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  lBeginReadTransa
204e0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
204f0 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20  al, &changed);. 
20500 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20510 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b  OK || changed ){
20520 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
20530 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
20540 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
20550 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
20560 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
20570 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
20580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
20590 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
205a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
205b0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
205c0 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f  e transition fro
205d0 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  m PAGER_OPEN.** 
205e0 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
205f0 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69  state to determi
20600 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ne the size of t
20610 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20620 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73  .** in pages (as
20630 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20  suming the page 
20640 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73  size currently s
20650 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70  tored in Pager.p
20660 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20  ageSize)..**.** 
20670 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
20680 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
20690 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
206a0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
206b0 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67  tabase.** in pag
206c0 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
206d0 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69  *pnPage. Otherwi
206e0 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
206f0 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51  e (perhaps.** SQ
20700 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
20710 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
20720 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
20730 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
20740 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20750 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
20760 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
20770 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
20780 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
20790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
207a0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
207b0 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
207c0 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c  /* Query the WAL
207d0 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20   sub-system for 
207e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
207f0 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65  e. The WalDbsize
20800 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ().  ** function
20810 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   returns zero if
20820 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20   the WAL is not 
20830 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72  open (i.e. Pager
20840 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20  .pWal==0), or.  
20850 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
20860 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  se size is not a
20870 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61  vailable. The da
20880 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
20890 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ot.  ** availabl
208a0 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
208b0 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65  ub-system if the
208c0 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70   log file is emp
208d0 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61  ty or.  ** conta
208e0 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d  ins no valid com
208f0 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
20900 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
20910 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20920 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
20930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20940 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
20950 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
20960 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20970 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
20980 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
20990 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61  File==0 );.  nPa
209a0 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44  ge = sqlite3WalD
209b0 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
209c0 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  al);..  /* If th
209d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
209e0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
209f0 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
20a00 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  le from the.  **
20a10 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c   WAL sub-system,
20a20 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
20a30 61 67 65 20 63 6f 75 6e 74 20 62 61 73 65 64 20  age count based 
20a40 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20  on the size of. 
20a50 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
20a60 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73   file.  If the s
20a70 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20a80 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
20a90 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  an.  ** integer 
20aa0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
20ab0 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64  page-size, round
20ac0 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   up the result..
20ad0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20ae0 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 73  ==0 && ALWAYS(is
20af0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
20b00 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d  ) ){.    i64 n =
20b10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20b20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
20b30 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74  f db file in byt
20b40 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  es */.    int rc
20b50 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
20b60 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
20b70 20 26 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63   &n);.    if( rc
20b80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20b90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20ba0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
20bb0 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67  = (Pgno)((n+pPag
20bc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20  er->pageSize-1) 
20bd0 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
20be0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
20bf0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
20c00 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
20c10 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
20c20 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ater than the.  
20c30 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
20c40 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
20c50 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
20c60 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
20c70 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
20c80 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
20c90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
20ca0 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
20cb0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
20cc0 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
20cd0 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70  nPage;.  }..  *p
20ce0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
20cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20d00 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
20d10 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
20d20 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
20d30 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
20d40 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
20d50 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
20d60 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
20d70 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64   exists if the d
20d80 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
20d90 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74  mpy, or verify t
20da0 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  hat the *-wal fi
20db0 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  le does.** not e
20dc0 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e  xist (by deletin
20dd0 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74  g it) if the dat
20de0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d  abase file is em
20df0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
20e00 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
20e10 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20  t empty and the 
20e20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
20e30 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65  s, open the page
20e40 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65  r.** in WAL mode
20e50 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
20e60 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69  se is empty or i
20e70 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20  f no *-wal file 
20e80 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66  exists and.** if
20e90 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
20ea0 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65  , make sure Page
20eb0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  r.journalMode is
20ec0 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50   not set to.** P
20ed0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20ee0 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  _WAL..**.** Retu
20ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  rn SQLITE_OK or 
20f00 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
20f10 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
20f20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
20f30 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
20f40 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
20f50 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
20f60 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
20f70 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
20f80 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
20f90 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
20fa0 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
20fb0 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
20fc0 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
20fd0 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
20fe0 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
20ff0 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
21000 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
21010 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
21020 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
21030 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
21040 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
21050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
21060 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
21070 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
21080 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
21090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
210a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
210b0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
210c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
210d0 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
210e0 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  D_LOCK );..  if(
210f0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
21100 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
21110 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
21120 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21130 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
21140 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ts */.    rc = s
21150 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
21160 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21170 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
21180 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
21190 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c  S_EXISTS, &isWal
211a0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
211b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
211c0 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c  .      if( isWal
211d0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
211e0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
211f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
21200 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21210 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
21220 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
21230 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
21240 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
21250 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
21260 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
21270 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
21280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21290 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
212a0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
212b0 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  >zWal, 0);.     
212c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
212d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
212e0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
212f0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
21300 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
21310 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21320 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
21330 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
21340 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
21350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
21360 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
21370 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
21380 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
21390 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
213a0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
213b0 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
213c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
213d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
213e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
213f0 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
21400 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
21410 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
21420 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
21430 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
21440 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
21450 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
21460 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
21470 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
21480 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
21490 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
214a0 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
214b0 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
214c0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
214d0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
214e0 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
214f0 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
21500 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
21510 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
21520 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
21530 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
21540 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
21550 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
21560 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
21570 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
21580 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
21590 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
215a0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
215b0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
215c0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
215d0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
215e0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
215f0 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
21600 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
21610 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21620 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
21630 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
21640 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
21650 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
21660 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
21670 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
21680 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
21690 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
216a0 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
216b0 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
216c0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
216d0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
216e0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
216f0 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
21700 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
21710 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
21720 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
21730 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
21740 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
21750 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
21760 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
21770 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
21780 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
21790 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
217a0 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
217b0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
217c0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
217d0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
217e0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
217f0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
21800 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
21810 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
21820 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
21830 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
21840 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
21850 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
21860 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
21870 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
21880 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
21890 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
218a0 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
218b0 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
218c0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
218d0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
218e0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
218f0 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
21900 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
21910 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
21920 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
21930 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
21940 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
21950 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
21960 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
21970 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
21980 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
21990 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
219a0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
219b0 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
219c0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
219d0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
219e0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
219f0 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
21a00 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
21a10 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
21a20 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
21a30 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
21a40 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
21a50 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
21a60 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
21a70 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
21a80 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
21a90 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
21aa0 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
21ab0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
21ac0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
21ad0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
21ae0 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
21af0 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
21b00 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
21b30 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
21b40 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
21b50 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
21b60 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
21b70 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
21b80 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
21b90 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
21ba0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
21bb0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
21bc0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
21bd0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
21be0 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
21bf0 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
21c00 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
21c10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
21c20 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
21c30 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
21c40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
21c50 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
21c60 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20  TER_LOCKED );.. 
21c70 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
21c80 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
21c90 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
21ca0 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
21cb0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
21cc0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
21cd0 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
21ce0 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
21cf0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
21d00 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
21d10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21d20 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
21d30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
21d40 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
21d50 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
21d60 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
21d70 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
21d80 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
21d90 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
21da0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
21db0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
21dc0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
21dd0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
21de0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
21df0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
21e00 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
21e10 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
21e20 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
21e30 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
21e40 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
21e50 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
21e60 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
21e70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
21e80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21e90 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
21ea0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
21eb0 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
21ec0 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
21ed0 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
21ee0 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
21ef0 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
21f00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21f10 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
21f20 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
21f30 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
21f40 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
21f50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21f60 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
21f70 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
21f80 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
21f90 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
21fa0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
21fb0 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
21fc0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
21fd0 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
21fe0 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
21ff0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
22000 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
22010 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
22020 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
22030 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
22040 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
22050 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
22060 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
22070 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
22080 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
22090 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
220a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
220b0 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
220c0 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
220d0 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
220e0 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
220f0 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
22100 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
22110 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
22120 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
22130 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
22140 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
22150 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
22160 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
22170 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
22180 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
22190 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
221a0 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
221b0 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
221c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
221d0 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
221e0 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
221f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
22200 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22210 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
22220 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
22230 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
22240 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
22250 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
22260 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
22270 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
22280 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
22290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
222a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
222b0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
222c0 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
222d0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
222e0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
222f0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
22300 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
22310 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
22320 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
22330 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
22340 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
22350 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
22360 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
22370 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
22380 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
22390 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
223a0 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
223b0 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
223c0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
223d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
223e0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
223f0 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
22400 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
22410 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
22420 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
22430 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
22440 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
22450 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
22460 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
22470 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
22480 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
22490 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
224a0 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
224b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
224c0 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
224d0 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
224e0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
224f0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
22500 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
22510 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
22520 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
22530 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
22540 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
22550 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
22560 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
22570 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
22580 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
22590 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
225a0 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
225b0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
225c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
225d0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
225e0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
225f0 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
22600 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
22610 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
22620 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
22630 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
22640 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
22650 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
22660 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
22670 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
22680 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
22690 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
226a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
226b0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
226c0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
226d0 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
226e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
226f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22700 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
22710 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22720 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
22730 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
22740 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
22750 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
22760 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
22770 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
22780 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
22790 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
227a0 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
227b0 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
227c0 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
227d0 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
227e0 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
227f0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
22800 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
22810 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
22820 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
22830 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
22840 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22850 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
22860 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
22870 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
22880 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22890 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
228a0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
228b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
228c0 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
228d0 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
228e0 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
228f0 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
22900 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
22910 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
22920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22930 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
22940 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
22950 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
22960 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
22970 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
22980 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
22990 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
229a0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
229b0 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
229c0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
229d0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
229e0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
229f0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
22a00 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
22a10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22a20 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
22a30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
22a40 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
22a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
22a60 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
22a70 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
22a80 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
22a90 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62  are allowed.** b
22aa0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
22ab0 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61   to recycle clea
22ac0 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67  n and unused pag
22ad0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
22ae0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
22af0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
22b00 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
22b10 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
22b20 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
22b30 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
22b40 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
22b50 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
22b60 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
22b70 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
22b80 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  t are allowed.**
22b90 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
22ba0 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65  ng to spill page
22bb0 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  s to journal..*/
22bc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22bd0 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61  rSetSpillsize(Pa
22be0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
22bf0 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75   mxPage){.  retu
22c00 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
22c10 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61  SetSpillsize(pPa
22c20 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
22c30 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
22c40 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43  Invoke SQLITE_FC
22c50 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61  NTL_MMAP_SIZE ba
22c60 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65  sed on the curre
22c70 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d  nt value of szMm
22c80 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ap..*/.static vo
22c90 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  id pagerFixMapli
22ca0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
22cb0 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  r){.#if SQLITE_M
22cc0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
22cd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
22ce0 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  d = pPager->fd;.
22cf0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29    if( isOpen(fd)
22d00 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73   && fd->pMethods
22d10 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b  ->iVersion>=3 ){
22d20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
22d30 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20  64 sz;.    sz = 
22d40 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a  pPager->szMmap;.
22d50 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65      pPager->bUse
22d60 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a  Fetch = (sz>0);.
22d70 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74      setGetterMet
22d80 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  hod(pPager);.   
22d90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
22da0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
22db0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
22dc0 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73  TL_MMAP_SIZE, &s
22dd0 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  z);.  }.#endif.}
22de0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
22df0 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
22e00 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61  of any memory ma
22e10 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68  pping made of th
22e20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22e30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22e40 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
22e50 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
22e60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
22e70 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72  zMmap){.  pPager
22e80 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61  ->szMmap = szMma
22e90 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70  p;.  pagerFixMap
22ea0 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d  limit(pPager);.}
22eb0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20  ../*.** Free as 
22ec0 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
22ed0 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65  ossible from the
22ee0 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20   pager..*/.void 
22ef0 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
22f00 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nk(Pager *pPager
22f10 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
22f20 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d  heShrink(pPager-
22f30 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
22f40 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69  .** Adjust setti
22f50 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  ngs of the pager
22f60 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
22f70 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61  ied in the pgFla
22f80 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  gs parameter..**
22f90 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20  .** The "level" 
22fa0 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  in pgFlags & PAG
22fb0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
22fc0 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62  ASK sets the rob
22fd0 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68  ustness.** of th
22fe0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
22ff0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
23000 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20  rashes or power 
23010 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63  failures by.** c
23020 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
23030 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
23040 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  hen writing the 
23050 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
23060 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65  re are four leve
23070 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
23080 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
23090 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
230a0 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
230b0 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
230d0 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
230e0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
230f0 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
23100 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
23110 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
23120 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
23130 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
23140 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
23150 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
23160 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
23170 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
23190 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
231a0 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
231b0 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
231c0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
231d0 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
231e0 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
231f0 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
23200 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
23210 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
23220 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
23230 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
23240 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
23250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
23260 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
23270 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
23280 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
23290 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
232a0 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
232b0 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
232c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
232d0 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
232e0 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
232f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
23300 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
23320 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
23330 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
23340 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
23350 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
23360 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
23370 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
23380 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
23390 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
233a0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
233b0 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
233c0 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
233d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
233e0 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
233f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
23400 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
23410 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
23420 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
23430 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
23440 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
23450 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
23460 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41  ..**.**    EXTRA
23470 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
23480 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68  e FULL except th
23490 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73  at is also syncs
234a0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
234b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
234c0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
234d0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
234e0 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c  l after the roll
234f0 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20  back.**         
23500 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20       journal is 
23510 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20  unlinked..**.** 
23520 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72  The above is for
23530 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72   a rollback-jour
23540 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57  nal mode.  For W
23550 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e  AL mode, OFF con
23560 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61  tinues.** to mea
23570 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20  n that no syncs 
23580 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52  ever occur.  NOR
23590 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  MAL means that t
235a0 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64  he WAL is synced
235b0 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65  .** prior to the
235c0 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70   start of checkp
235d0 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68  oint and that th
235e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
235f0 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20  is synced.** at 
23600 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
23610 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  f the checkpoint
23620 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63   if the entire c
23630 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41  ontent of the WA
23640 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e  L.** was written
23650 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
23660 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f  atabase.  But no
23670 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73   sync operations
23680 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e   occur for.** an
23690 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74   ordinary commit
236a0 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20   in NORMAL mode 
236b0 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20  with WAL.  FULL 
236c0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
236d0 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79  AL.** file is sy
236e0 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  nced following e
236f0 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61  ach commit opera
23700 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f  tion, in additio
23710 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63  n to the.** sync
23720 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
23730 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65  h NORMAL.  There
23740 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
23750 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a  e between FULL.*
23760 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20  * and EXTRA for 
23770 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  WAL mode..**.** 
23780 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73  Do not confuse s
23790 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
237a0 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43  with SQLITE_SYNC
237b0 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53  _FULL.  The.** S
237c0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
237d0 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75  macro means to u
237e0 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74  se the MacOSX-st
237f0 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a  yle full-fsync.*
23800 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f  * using fcntl(F_
23810 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c  FULLFSYNC).  SQL
23820 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
23830 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a  means to do an.*
23840 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63  * ordinary fsync
23850 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20  () call.  There 
23860 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
23870 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f   between SQLITE_
23880 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64  SYNC_FULL.** and
23890 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
238a0 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73  MAL on platforms
238b0 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f   other than MacO
238c0 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20  SX.  But the.** 
238d0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
238e0 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e   versus synchron
238f0 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69  ous=NORMAL setti
23900 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ng determines wh
23910 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20  en.** the xSync 
23920 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c  primitive is cal
23930 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76  led and is relev
23940 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66  ant to all platf
23950 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  orms..**.** Nume
23960 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
23970 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
23980 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
23990 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
239a0 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
239b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
239c0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
239d0 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
239e0 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50  gerSetFlags(.  P
239f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
23a00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
23a10 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20  r to set safety 
23a20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75  level for */.  u
23a30 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
23a40 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
23a50 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e  flags */.){.  un
23a60 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70  signed level = p
23a70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53  gFlags & PAGER_S
23a80 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b  YNCHRONOUS_MASK;
23a90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
23aa0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
23ab0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
23ac0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  1;.    pPager->f
23ad0 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  ullSync = 0;.   
23ae0 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
23af0 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
23b00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
23b10 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41  ync =  level==PA
23b20 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
23b30 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50  OFF ?1:0;.    pP
23b40 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
23b50 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59   level>=PAGER_SY
23b60 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f  NCHRONOUS_FULL ?
23b70 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1:0;.    pPager-
23b80 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76  >extraSync = lev
23b90 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52  el==PAGER_SYNCHR
23ba0 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30  ONOUS_EXTRA ?1:0
23bb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
23bc0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
23bd0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23be0 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ags = 0;.  }else
23bf0 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
23c00 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29  AGER_FULLFSYNC )
23c10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
23c20 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23c30 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
23c40 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23c50 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
23c60 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
23c70 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77  .  }.  pPager->w
23c80 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 28 70  alSyncFlags = (p
23c90 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23ca0 3c 3c 32 29 3b 0a 20 20 69 66 28 20 70 50 61 67  <<2);.  if( pPag
23cb0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
23cc0 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
23cd0 79 6e 63 46 6c 61 67 73 20 7c 3d 20 70 50 61 67  yncFlags |= pPag
23ce0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20  er->syncFlags;. 
23cf0 20 7d 0a 20 20 69 66 28 20 28 70 67 46 6c 61 67   }.  if( (pgFlag
23d00 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46  s & PAGER_CKPT_F
23d10 55 4c 4c 46 53 59 4e 43 29 20 26 26 20 21 70 50  ULLFSYNC) && !pP
23d20 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
23d30 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
23d40 79 6e 63 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  yncFlags |= (SQL
23d50 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32  ITE_SYNC_FULL<<2
23d60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46  );.  }.  if( pgF
23d70 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43  lags & PAGER_CAC
23d80 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70  HESPILL ){.    p
23d90 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
23da0 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f  l &= ~SPILLFLAG_
23db0 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OFF;.  }else{.  
23dc0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
23dd0 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
23de0 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  G_OFF;.  }.}.#en
23df0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
23e00 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
23e10 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
23e20 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
23e30 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
23e40 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
23e50 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23e60 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
23e70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
23e80 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
23e90 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
23ea0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
23eb0 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
23ec0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
23ed0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
23ee0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
23ef0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
23f00 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
23f10 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
23f20 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
23f30 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
23f40 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
23f50 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
23f60 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
23f70 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
23f80 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
23f90 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
23fa0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
23fb0 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
23fc0 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
23fd0 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
23fe0 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
23ff0 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
24000 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
24010 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
24020 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
24030 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
24040 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
24050 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
24060 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
24070 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
24080 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
24090 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
240a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
240b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
240c0 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
240d0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
240e0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
240f0 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
24100 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
24110 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
24120 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
24130 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
24140 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
24150 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
24160 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
24170 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24190 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
241a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
241b0 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
241c0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
241d0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
241e0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
241f0 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
24200 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
24210 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
24220 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
24230 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
24240 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
24250 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
24260 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
24270 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
24280 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
24290 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
242a0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
242b0 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
242c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
242d0 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
242e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
242f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
24300 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
24310 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
24320 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
24330 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
24340 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
24350 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
24360 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
24370 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
24380 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
24390 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
243a0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
243b0 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
243c0 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
243d0 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
243e0 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
243f0 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
24400 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
24410 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
24420 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
24430 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
24440 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
24450 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
24460 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
24470 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
24480 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
24490 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
244a0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
244b0 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
244d0 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
244e0 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
244f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24520 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
24530 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
24540 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
24550 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
24560 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
24570 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
24580 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
24590 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
245a0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
245b0 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
245c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
245d0 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
245e0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
245f0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
24600 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
24610 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
24620 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
24630 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
24640 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
24650 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
24660 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
24670 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
24680 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
24690 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
246a0 42 75 73 79 48 61 6e 64 6c 65 72 28 0a 20 20 50  BusyHandler(.  P
246b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
246e0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
246f0 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
24700 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
24710 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
24720 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
24730 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
24740 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
24750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24760 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
24770 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
24780 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 2a 61  */.){.  void **a
24790 70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  p;.  pPager->xBu
247a0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
247b0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
247c0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
247d0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
247e0 65 72 41 72 67 3b 0a 20 20 61 70 20 3d 20 28 76  erArg;.  ap = (v
247f0 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
24800 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
24810 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29  assert( ((int(*)
24820 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29  (void *))(ap[0])
24830 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20  )==xBusyHandler 
24840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 5b  );.  assert( ap[
24850 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72  1]==pBusyHandler
24860 41 72 67 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  Arg );.  sqlite3
24870 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
24880 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
24890 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
248a0 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
248b0 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ap);.}../*.** Ch
248c0 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
248d0 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
248e0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
248f0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
24900 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
24910 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24920 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
24930 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
24940 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
24950 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24960 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
24970 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
24980 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
24990 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
249a0 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
249b0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
249c0 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
249d0 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
249e0 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
249f0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
24a00 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
24a10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
24a20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
24a30 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
24a40 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
24a50 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
24a60 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
24a70 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
24a80 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
24a90 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
24aa0 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
24ab0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
24ac0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
24ad0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
24ae0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
24af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24b00 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
24b10 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
24b20 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
24b30 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
24b40 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
24b50 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
24b60 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
24b70 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
24b80 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
24b90 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
24ba0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
24bb0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
24bc0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
24bd0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24be0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
24bf0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
24c00 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
24c10 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
24c20 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
24c30 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
24c40 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
24c50 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
24c60 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
24c70 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
24c80 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
24c90 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
24ca0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
24cb0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
24cc0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
24cd0 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
24ce0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
24cf0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
24d00 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
24d10 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
24d20 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
24d30 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
24d40 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
24d50 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
24d60 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
24d70 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
24d80 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
24d90 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
24da0 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
24db0 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
24dc0 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
24dd0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
24de0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
24df0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
24e00 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
24e10 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
24e20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
24e30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24e40 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
24e50 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
24e60 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
24e70 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
24e80 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
24e90 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
24ea0 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
24eb0 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
24ec0 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
24ed0 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
24ee0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
24ef0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
24f00 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
24f10 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
24f20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
24f30 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
24f40 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24f50 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
24f60 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
24f70 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
24f80 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
24f90 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
24fa0 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
24fb0 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
24fc0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
24fd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
24fe0 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
24ff0 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
25000 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
25010 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
25020 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
25030 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
25040 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
25050 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
25060 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
25070 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
25080 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
25090 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
250a0 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
250b0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
250c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
250d0 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
250e0 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
250f0 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
25100 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
25110 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
25120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25130 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
25140 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
25150 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
25160 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
25170 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
25180 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
25190 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
251a0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
251b0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
251c0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
251d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
251e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 38 20 62 79  ){.      /* 8 by
251f0 74 65 73 20 6f 66 20 7a 65 72 6f 65 64 20 6f 76  tes of zeroed ov
25200 65 72 72 75 6e 20 73 70 61 63 65 20 69 73 20 73  errun space is s
25210 75 66 66 69 63 69 65 6e 74 20 73 6f 20 74 68 61  ufficient so tha
25220 74 20 74 68 65 20 62 2d 74 72 65 65 0a 20 20 20  t the b-tree.   
25230 20 20 20 2a 20 63 65 6c 6c 20 68 65 61 64 65 72     * cell header
25240 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 65 76   parser will nev
25250 65 72 20 72 75 6e 20 6f 66 66 20 74 68 65 20 65  er run off the e
25260 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
25270 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  tion */.      pN
25280 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
25290 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
252a0 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
252b0 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
252c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
252d0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
252e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
252f0 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2b      memset(pNew+
25300 70 61 67 65 53 69 7a 65 2c 20 30 2c 20 38 29 3b  pageSize, 0, 8);
25310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
25320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
25340 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
25350 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
25360 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
25370 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
25380 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
25390 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
253a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
253b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
253c0 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
253d0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
253e0 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
253f0 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
25400 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
25410 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74  e = (Pgno)((nByt
25420 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61  e+pageSize-1)/pa
25430 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
25440 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
25450 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
25460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
25470 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65  ite3PageFree(pNe
25480 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
25490 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
254a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
254b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
254c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
254d0 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73  Reserve<0 ) nRes
254e0 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  erve = pPager->n
254f0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
25500 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
25510 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30   && nReserve<100
25520 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
25530 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36  >nReserve = (i16
25540 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  )nReserve;.    p
25550 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
25560 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
25570 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
25580 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
25590 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
255a0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
255b0 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
255c0 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
255d0 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
255e0 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
255f0 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
25600 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
25610 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
25620 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
25630 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
25640 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
25650 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
25660 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
25670 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
25680 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
25690 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
256a0 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
256b0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
256c0 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
256d0 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
256e0 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
256f0 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
25700 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
25710 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
25720 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
25730 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
25740 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
25750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
25760 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
25770 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
25780 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
25790 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
257a0 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
257b0 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
257c0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
257d0 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
257e0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
257f0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
25800 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
25810 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
25820 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
25830 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
25840 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
25850 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
25860 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
25870 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
25880 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
25890 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
258a0 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
258b0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
258c0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
258d0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Page;.  }.  asse
258e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
258f0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
25900 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64  ;      /* Called
25910 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50   only by OP_MaxP
25920 67 63 6e 74 20 2a 2f 0a 20 20 2f 2a 20 61 73 73  gcnt */.  /* ass
25930 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
25940 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno>=pPager->dbS
25950 69 7a 65 20 29 3b 20 2a 2f 0a 20 20 2f 2a 20 4f  ize ); */.  /* O
25960 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 73 75 72  P_MaxPgcnt ensur
25970 65 73 20 74 68 61 74 20 74 68 65 20 70 61 72 61  es that the para
25980 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
25990 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
259a0 20 6e 6f 74 0a 20 20 2a 2a 20 6c 65 73 73 20 74   not.  ** less t
259b0 68 61 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  han the total nu
259c0 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
259d0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
259e0 61 73 65 2e 20 42 75 74 20 74 68 69 73 0a 20 20  ase. But this.  
259f0 2a 2a 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74  ** may be less t
25a00 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
25a10 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 61 73 73  , and so the ass
25a20 65 72 74 28 29 20 61 62 6f 76 65 20 69 73 20 6e  ert() above is n
25a30 6f 74 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65  ot valid */.  re
25a40 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
25a50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
25a60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
25a70 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
25a80 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
25a90 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
25aa0 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
25ab0 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
25ac0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
25ad0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
25ae0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
25af0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
25b00 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
25b10 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
25b20 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
25b30 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
25b40 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
25b50 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
25b60 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
25b70 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
25b80 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
25b90 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
25ba0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
25bb0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
25bc0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
25bd0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
25be0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
25bf0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25c00 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
25c10 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
25c20 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
25c30 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
25c40 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
25c50 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
25c60 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
25c70 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
25c80 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
25c90 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
25ca0 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
25cb0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
25cc0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25cd0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
25ce0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
25cf0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
25d00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
25d10 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
25d20 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
25d30 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
25d40 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
25d50 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
25d60 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
25d70 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
25d80 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
25d90 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
25da0 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
25db0 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
25dc0 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
25dd0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
25de0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
25df0 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
25e00 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
25e10 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
25e20 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
25e30 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
25e40 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
25e50 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
25e60 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
25e70 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
25e80 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
25e90 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
25ea0 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
25eb0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
25ec0 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
25ed0 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
25ee0 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
25ef0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
25f00 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
25f10 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
25f20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
25f30 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
25f40 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
25f50 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
25f60 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
25f70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25f80 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
25f90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25fa0 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
25fb0 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
25fc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25fd0 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
25fe0 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
25ff0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
26000 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
26010 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
26020 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
26030 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
26040 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
26050 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
26060 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
26070 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
26080 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
26090 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
260a0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
260b0 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
260c0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
260d0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
260e0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
260f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
26100 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
26110 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
26120 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
26130 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
26140 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
26150 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
26160 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
26170 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
26180 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
26190 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
261a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
261b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
261c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
261d0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
261e0 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
261f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
26200 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
26210 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
26220 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
26230 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
26240 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
26250 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
26260 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
26270 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
26280 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
26290 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
262a0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
262b0 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
262c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
262d0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
262e0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
262f0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
26300 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
26310 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
26320 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26330 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
26340 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
26350 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
26360 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
26370 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
26380 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
26390 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
263a0 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
263b0 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
263c0 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
263d0 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
263e0 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
263f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26400 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
26410 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
26420 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
26430 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
26440 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
26450 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
26460 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
26470 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
26480 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
26490 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
264a0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
264b0 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
264c0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
264d0 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
264e0 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
264f0 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
26500 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
26510 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
26520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
26530 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
26540 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
26550 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
26560 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
26570 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
26580 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
26590 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
265a0 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
265b0 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
265c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
265d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
265e0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
265f0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
26600 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
26610 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26630 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26640 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
26650 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
26660 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
26670 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
26680 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
26690 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
266a0 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
266b0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
266c0 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
266d0 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
266e0 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
266f0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
26700 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
26710 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
26720 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
26730 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
26740 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
26750 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
26760 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
26770 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
26780 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
26790 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
267a0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
267b0 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
267c0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
267d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
267e0 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
267f0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
26800 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
26810 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
26820 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
26830 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
26840 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
26850 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
26860 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26870 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
26880 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26890 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
268a0 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
268b0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
268c0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
268d0 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
268e0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
268f0 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
26900 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
26910 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
26920 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
26930 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
26940 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
26950 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
26960 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
26970 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
26980 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
26990 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
269a0 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
269b0 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
269c0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
269d0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
269e0 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
269f0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
26a00 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
26a10 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
26a20 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
26a30 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
26a40 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
26a50 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
26a60 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
26a70 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
26a80 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
26a90 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
26aa0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
26ab0 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
26ac0 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
26ad0 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
26ae0 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
26af0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
26b00 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
26b10 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
26b20 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
26b30 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
26b40 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
26b50 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
26b60 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
26b70 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
26b80 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
26b90 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
26ba0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
26bb0 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
26bc0 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
26bd0 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
26be0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
26bf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26c00 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
26c10 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
26c20 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
26c30 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
26c40 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
26c50 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
26c60 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
26c70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
26c80 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
26c90 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
26ca0 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
26cb0 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
26cc0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
26cd0 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
26ce0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
26cf0 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
26d00 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
26d10 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
26d20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
26d30 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
26d40 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
26d50 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
26d60 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
26d70 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
26d80 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
26d90 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
26da0 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
26db0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
26dc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26dd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
26de0 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
26df0 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
26e00 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26e10 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
26e20 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
26e30 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26e40 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
26e50 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
26e60 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
26e70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
26e80 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
26e90 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
26ea0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
26eb0 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
26ec0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26ed0 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
26ee0 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
26ef0 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
26f00 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
26f10 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
26f20 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
26f30 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
26f40 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
26f50 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
26f60 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
26f70 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26f80 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26f90 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26fa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26fb0 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
26fc0 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
26fd0 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
26fe0 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
26ff0 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
27000 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
27010 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
27020 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
27030 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
27040 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
27050 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
27060 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
27070 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
27080 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
27090 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
270a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
270b0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
270c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
270d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
270e0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
270f0 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
27100 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
27110 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
27120 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
27130 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
27140 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
27150 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
27160 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
27170 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
27180 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
27190 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
271a0 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
271b0 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
271c0 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
271d0 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
271e0 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
271f0 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
27200 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
27210 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
27220 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
27230 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
27240 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
27250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27260 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
27270 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
27280 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
27290 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
272a0 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
272b0 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
272c0 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
272d0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
272e0 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
272f0 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
27300 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
27310 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
27320 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
27330 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
27340 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
27350 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
27360 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
27370 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
27380 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
27390 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
273a0 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
273b0 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
273c0 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
273d0 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
273e0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
273f0 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
27400 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27410 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
27420 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
27430 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
27440 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
27450 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
27460 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
27470 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
27480 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
27490 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
274a0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
274b0 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
274c0 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
274d0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
274e0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
274f0 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
27500 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
27510 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
27520 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
27530 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
27540 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
27550 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
27560 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
27570 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
27580 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
27590 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
275a0 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
275b0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
275c0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
275d0 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
275e0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
275f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
27600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27610 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
27620 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
27630 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
27640 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
27650 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
27660 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
27670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
27680 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
27690 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
276a0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
276b0 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
276c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
276d0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
276e0 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74  SIZE>0./*.** Obt
276f0 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
27700 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70  to a memory mapp
27710 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66  ed page object f
27720 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  or page number p
27730 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77  gno. .** The new
27740 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65   object will use
27750 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61   the pointer pDa
27760 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ta, obtained fro
27770 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49  m xFetch()..** I
27780 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
27790 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69  t *ppPage to poi
277a0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
277b0 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  ge reference.** 
277c0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
277d0 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
277e0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
277f0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
27800 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20   set.** *ppPage 
27810 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50  to zero..**.** P
27820 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f  age references o
27830 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69  btained by calli
27840 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
27850 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61   should be relea
27860 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e  sed.** by callin
27870 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  g pagerReleaseMa
27880 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
27890 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
278a0 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61  ireMapPage(.  Pa
278b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
278d0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
278e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
27910 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61  r */.  void *pDa
27920 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
27930 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
27940 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68  ()'d data for th
27950 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
27960 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  dr **ppPage     
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27980 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61  OUT: Acquired pa
27990 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ge object */.){.
279a0 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
279d0 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72  ed page to retur
279e0 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50  n */.  .  if( pP
279f0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27a00 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  ist ){.    *ppPa
27a10 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d  ge = p = pPager-
27a20 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
27a30 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61      pPager->pMma
27a40 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70  pFreelist = p->p
27a50 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
27a60 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  irty = 0;.    as
27a70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45  sert( pPager->nE
27a80 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d  xtra>=8 );.    m
27a90 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c  emset(p->pExtra,
27aa0 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, 8);.  }else{
27ab0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
27ac0 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69   = (PgHdr *)sqli
27ad0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
27ae0 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50  zeof(PgHdr) + pP
27af0 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
27b00 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
27b10 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
27b20 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
27b30 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20  , (i64)(pgno-1) 
27b40 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
27b50 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
27b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27b70 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27b80 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
27b90 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
27ba0 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
27bb0 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
27bc0 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
27bd0 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
27be0 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
27bf0 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
27c00 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
27c10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
27c20 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
27c30 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
27c40 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
27c50 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
27c60 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
27c70 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
27c80 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
27c90 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
27ca0 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
27cb0 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
27cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27cd0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
27ce0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
27cf0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
27d00 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61  pPg. pPg must ha
27d10 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64  ve been returned
27d20 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69   by an .** earli
27d30 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  er call to pager
27d40 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29  AcquireMapPage()
27d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27d60 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
27d70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
27d80 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
27d90 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
27da0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
27db0 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44  Out--;.  pPg->pD
27dc0 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
27dd0 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
27de0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
27df0 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20  elist = pPg;..  
27e00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27e10 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
27e20 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73  ersion>=3 );.  s
27e30 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
27e40 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
27e50 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70  )(pPg->pgno-1)*p
27e60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
27e70 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a   pPg->pData);.}.
27e80 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
27e90 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74  PgHdr objects st
27ea0 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65  ored in the Page
27eb0 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  r.pMmapFreelist 
27ec0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
27ed0 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61  void pagerFreeMa
27ee0 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61  pHdrs(Pager *pPa
27ef0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
27f00 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  ;.  PgHdr *pNext
27f10 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
27f20 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27f30 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
27f40 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69    pNext = p->pDi
27f50 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rty;.    sqlite3
27f60 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
27f70 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
27f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27f90 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c  e has not be del
27fa0 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20  eted or renamed 
27fb0 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65  out from.** unde
27fc0 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65  r the pager.  Re
27fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
27fe0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
27ff0 73 20 73 74 69 6c 6c 20 77 68 65 72 65 20 69 74  s still where it
28000 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20   ought.** to be 
28010 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  on disk.  Return
28020 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54   non-zero (SQLIT
28030 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
28040 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ED or some other
28050 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66   error.** code f
28060 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  rom sqlite3OsAcc
28070 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61  ess()) if the da
28080 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20  tabase has gone 
28090 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  missing..*/.stat
280a0 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49  ic int databaseI
280b0 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a  sUnmoved(Pager *
280c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62  pPager){.  int b
280d0 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
280e0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
280f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
28100 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28110 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
28120 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65  ->dbSize==0 ) re
28130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28140 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28150 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70  ->zFilename && p
28160 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
28170 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  [0] );.  rc = sq
28180 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
28190 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
281a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
281b0 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65  MOVED, &bHasMove
281c0 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
281d0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
281e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48  .    /* If the H
281f0 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f  AS_MOVED file-co
28200 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65  ntrol is unimple
28210 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74  mented, assume t
28220 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20  hat the file.   
28230 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
28240 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73   moved.  That is
28250 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20   the historical 
28260 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69  behavior of SQLi
28270 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  te: prior to.   
28280 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e   ** version 3.8.
28290 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63  3, it never chec
282a0 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ked */.    rc = 
282b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
282c0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
282d0 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65  E_OK && bHasMove
282e0 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
282f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
28300 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74  MOVED;.  }.  ret
28310 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
28320 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
28330 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
28340 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
28350 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
28360 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
28370 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
28380 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
28390 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
283a0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
283b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
283c0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
283d0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
283e0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
283f0 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
28400 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
28410 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
28420 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
28430 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
28440 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
28450 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
28460 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
28470 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
28480 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
28490 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
284a0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
284b0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
284c0 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
284d0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
284e0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
284f0 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
28500 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
28510 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
28520 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
28530 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
28540 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
28550 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
28560 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
28570 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
28580 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
28590 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
285a0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38  lite3 *db){.  u8
285b0 20 2a 70 54 6d 70 20 3d 20 28 75 38 2a 29 70 50   *pTmp = (u8*)pP
285c0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
285d0 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c  .  assert( db ||
285e0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
285f0 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
28600 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
28610 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
28620 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  );.  disable_sim
28630 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
28640 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
28650 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
28660 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70  ;.  pagerFreeMap
28670 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20  Hdrs(pPager);.  
28680 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  /* pPager->errCo
28690 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  de = 0; */.  pPa
286a0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
286b0 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  de = 0;.#ifndef 
286c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
286d0 20 20 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20    {.    u8 *a = 
286e0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  0;.    assert( d
286f0 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57 61  b || pPager->pWa
28700 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  l==0 );.    if( 
28710 64 62 20 26 26 20 30 3d 3d 28 64 62 2d 3e 66 6c  db && 0==(db->fl
28720 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43  ags & SQLITE_NoC
28730 6b 70 74 4f 6e 43 6c 6f 73 65 29 20 0a 20 20 20  kptOnClose) .   
28740 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d    && SQLITE_OK==
28750 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65  databaseIsUnmove
28760 64 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 7b  d(pPager).    ){
28770 0a 20 20 20 20 20 20 61 20 3d 20 70 54 6d 70 3b  .      a = pTmp;
28780 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28790 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65  e3WalClose(pPage
287a0 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61  r->pWal, db, pPa
287b0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
287c0 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  s, pPager->pageS
287d0 69 7a 65 2c 61 29 3b 0a 20 20 20 20 70 50 61 67  ize,a);.    pPag
287e0 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20 20  er->pWal = 0;.  
287f0 7d 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  }.#endif.  pager
28800 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
28810 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
28820 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
28830 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
28840 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
28850 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
28860 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
28870 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
28880 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
28890 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
288a0 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
288b0 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
288c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
288d0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
288e0 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
288f0 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
28900 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
28910 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
28920 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
28930 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
28940 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
28950 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
28960 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
28970 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
28980 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
28990 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
289a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
289b0 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
289c0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
289d0 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
289e0 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
289f0 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
28a00 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
28a10 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
28a20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28a30 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
28a40 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
28a50 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
28a60 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
28a70 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
28a80 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
28a90 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
28aa0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
28ab0 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
28ac0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28ad0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
28ae0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28af0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
28b00 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
28b10 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
28b20 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
28b30 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
28b40 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
28b50 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
28b60 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
28b70 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
28b80 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
28b90 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
28ba0 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
28bb0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28bc0 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
28bd0 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
28be0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
28bf0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
28c00 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
28c10 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
28c20 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
28c30 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
28c40 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
28c50 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
28c60 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
28c70 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
28c80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
28c90 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
28ca0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
28cb0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
28cc0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
28cd0 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
28ce0 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
28cf0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
28d00 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
28d10 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
28d20 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
28d30 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
28d40 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
28d50 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
28d60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
28d70 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
28d80 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
28d90 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
28da0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
28db0 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
28dc0 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
28dd0 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
28de0 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
28df0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
28e00 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
28e10 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
28e20 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
28e30 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
28e40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
28e50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
28e60 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
28e70 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
28e80 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
28e90 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
28ea0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
28eb0 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
28ec0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
28ed0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
28ee0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
28ef0 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
28f00 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
28f10 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
28f20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
28f30 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
28f40 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
28f50 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
28f60 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
28f70 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
28f80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
28f90 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
28fa0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
28fb0 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
28fc0 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
28fd0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
28fe0 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
28ff0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
29000 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
29010 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
29020 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
29030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
29040 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
29050 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
29060 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
29070 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
29080 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
29090 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
290a0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
290b0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
290c0 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
290d0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
290e0 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
290f0 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
29100 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
29110 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
29120 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
29130 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
29140 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
29150 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
29160 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
29170 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
29180 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
29190 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
291a0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
291b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
291c0 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
291d0 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
291e0 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
291f0 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
29200 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
29210 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
29220 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
29230 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
29240 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
29250 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
29260 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
29270 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
29280 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
29290 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
292a0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
292b0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
292c0 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
292d0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
292e0 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
292f0 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
29300 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
29310 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
29320 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
29330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
29340 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
29350 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
29360 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
29370 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
29380 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
29390 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
293a0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
293b0 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
293c0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
293d0 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
293e0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
293f0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
29400 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
29410 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
29420 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
29430 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
29440 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
29450 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
29460 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
29470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29480 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
29490 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
294a0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
294b0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
294c0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
294d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
294e0 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
294f0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
29500 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
29510 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
29520 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
29530 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
29540 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
29550 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
29560 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
29570 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29580 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
29590 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
295a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
295b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
295c0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
295d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
295e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
295f0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
29600 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
29610 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
29620 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
29630 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
29640 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
29650 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
29660 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
29670 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
29680 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
29690 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
296a0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
296b0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
296c0 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
296d0 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
296e0 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
296f0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
29700 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
29710 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
29720 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
29730 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
29740 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
29750 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
29760 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
29770 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
29780 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
29790 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
297a0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
297b0 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
297c0 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
297d0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
297e0 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
297f0 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
29800 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
29810 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
29820 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
29830 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
29840 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
29850 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
29860 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
29870 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
29880 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
29890 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
298a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
298b0 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
298c0 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
298d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
298e0 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
298f0 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
29900 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
29910 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
29920 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
29930 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
29940 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
29950 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
29960 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
29970 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
29980 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
29990 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
299a0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
299b0 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
299c0 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
299d0 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
299e0 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
299f0 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
29a00 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
29a10 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
29a20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29a30 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
29a40 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
29a50 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
29a60 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
29a70 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
29a80 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
29a90 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
29aa0 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
29ab0 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
29ac0 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
29ad0 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
29ae0 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
29af0 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
29b00 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29b10 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
29b20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
29b30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
29b40 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
29b50 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
29b60 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
29b70 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
29b80 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
29b90 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
29ba0 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
29bb0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
29bc0 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
29bd0 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
29be0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
29bf0 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
29c00 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
29c10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29c20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
29c30 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
29c40 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
29c50 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
29c60 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
29c70 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
29c80 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
29c90 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
29ca0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
29cb0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
29cc0 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
29cd0 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
29ce0 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
29cf0 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
29d00 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
29d10 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
29d20 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
29d30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29d40 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
29d50 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
29d60 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
29d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
29d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
29d90 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
29da0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
29db0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
29dc0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
29dd0 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
29de0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29df0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
29e00 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
29e10 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
29e20 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
29e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
29e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
29e50 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
29e60 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
29e70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29e80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
29e90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
29ea0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
29eb0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
29ec0 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
29ed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
29ee0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
29ef0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
29f00 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
29f10 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
29f20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
29f30 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
29f40 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
29f50 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
29f60 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
29f70 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
29f80 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
29f90 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
29fa0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
29fb0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
29fc0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
29fd0 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
29fe0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
29ff0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
2a000 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
2a010 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
2a020 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
2a030 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
2a040 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
2a050 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
2a060 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
2a070 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
2a080 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
2a090 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
2a0a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
2a0b0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
2a0c0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
2a0d0 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
2a0e0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
2a0f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2a100 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2a110 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
2a120 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
2a130 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
2a140 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a150 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
2a160 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2a170 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
2a180 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
2a190 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
2a1a0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
2a1b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2a1c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
2a1d0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
2a1e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2a1f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a200 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a210 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
2a220 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
2a230 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
2a240 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
2a250 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
2a260 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2a270 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
2a280 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
2a290 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
2a2a0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
2a2b0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
2a2c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a2d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a2e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a2f0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
2a300 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
2a310 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
2a320 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
2a330 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
2a340 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
2a350 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2a360 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
2a370 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
2a380 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
2a390 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
2a3a0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
2a3b0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2a3c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
2a3d0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
2a3e0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
2a3f0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
2a400 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
2a410 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2a420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a440 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
2a450 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
2a460 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a470 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
2a480 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
2a490 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
2a4a0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
2a4b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
2a4c0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
2a4d0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
2a4e0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
2a4f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a500 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a510 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2a520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
2a530 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2a540 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2a550 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
2a560 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
2a570 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
2a580 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
2a590 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
2a5a0 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
2a5b0 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
2a5c0 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
2a5d0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
2a5e0 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
2a5f0 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
2a600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
2a610 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
2a620 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2a630 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
2a640 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
2a650 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
2a660 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2a670 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2a680 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a690 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2a6a0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
2a6b0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
2a6c0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
2a6d0 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
2a6e0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
2a6f0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
2a700 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
2a710 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
2a720 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
2a730 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
2a740 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
2a750 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2a760 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
2a770 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
2a780 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
2a790 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
2a7a0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
2a7b0 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
2a7c0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
2a7d0 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
2a7e0 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
2a7f0 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
2a800 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
2a810 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
2a820 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
2a830 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a840 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
2a850 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
2a860 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2a870 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
2a880 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
2a890 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
2a8a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2a8b0 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
2a8c0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
2a8d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
2a8e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2a8f0 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
2a900 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
2a910 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
2a920 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
2a930 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
2a940 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
2a950 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
2a960 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
2a970 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
2a980 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
2a990 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
2a9a0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
2a9b0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
2a9c0 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
2a9d0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
2a9e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2a9f0 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
2aa00 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
2aa10 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
2aa20 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
2aa30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2aa40 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
2aa50 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
2aa60 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
2aa70 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
2aa80 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
2aa90 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
2aaa0 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
2aab0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
2aac0 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
2aad0 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
2aae0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2aaf0 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
2ab00 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
2ab10 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
2ab20 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
2ab30 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
2ab40 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
2ab50 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
2ab60 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
2ab70 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
2ab80 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
2ab90 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
2aba0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2abb0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
2abc0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
2abd0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2abe0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2abf0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
2ac00 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
2ac10 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2ac20 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
2ac30 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
2ac40 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
2ac50 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
2ac60 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2ac70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
2ac80 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
2ac90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
2aca0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
2acb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2acc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2acd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2ace0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
2acf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
2ad00 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
2ad10 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
2ad20 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
2ad30 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
2ad40 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2ad50 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
2ad60 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2ad70 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  le || pPager->eS
2ad80 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2ad90 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
2ada0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
2adb0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
2adc0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2add0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ade0 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44  fd) || pList->pD
2adf0 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  irty==0 );..  /*
2ae00 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
2ae10 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
2ae20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
2ae30 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
2ae40 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
2ae50 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
2ae60 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
2ae70 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
2ae80 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
2ae90 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
2aea0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2aeb0 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
2aec0 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
2aed0 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
2aee0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
2aef0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2af00 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
2af10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2af20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2af30 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
2af40 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2af50 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
2af60 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
2af70 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
2af80 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
2af90 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
2afa0 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
2afb0 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
2afc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
2afd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
2afe0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2aff0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
2b000 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70  LITE_OK .   && p
2b010 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
2b020 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
2b030 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70  .   && (pList->p
2b040 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e  Dirty || pList->
2b050 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48  pgno>pPager->dbH
2b060 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20  intSize).  ){.  
2b070 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2b080 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
2b090 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
2b0a0 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
2b0b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
2b0c0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
2b0d0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
2b0e0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
2b0f0 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
2b100 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
2b110 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
2b120 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2b130 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
2b140 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2b150 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
2b160 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
2b170 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
2b180 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
2b190 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
2b1a0 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
2b1b0 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
2b1c0 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
2b1d0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
2b1e0 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
2b1f0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
2b200 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
2b210 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
2b220 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
2b230 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
2b240 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
2b250 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
2b260 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
2b270 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
2b280 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
2b290 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
2b2a0 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
2b2b0 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
2b2c0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
2b2d0 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
2b2e0 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
2b2f0 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
2b300 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
2b310 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
2b320 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
2b330 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
2b340 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
2b350 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
2b360 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
2b370 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
2b380 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
2b390 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
2b3a0 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2b3d0 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
2b3e0 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
2b3f0 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
2b400 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2b410 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b420 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
2b430 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
2b440 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
2b450 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
2b460 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
2b470 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
2b480 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
2b490 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
2b4a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b4b0 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29  MEM_BKPT, pData)
2b4c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
2b4d0 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
2b4e0 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
2b4f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2b500 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
2b510 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
2b520 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
2b530 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
2b540 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
2b550 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
2b560 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
2b570 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
2b580 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
2b590 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
2b5a0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
2b5b0 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
2b5c0 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
2b5d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b5e0 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
2b5f0 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
2b600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2b610 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
2b620 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2b630 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2b640 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
2b650 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
2b660 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
2b670 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
2b680 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
2b690 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2b6a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2b6b0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
2b6c0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2b6d0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
2b6e0 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
2b6f0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
2b700 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
2b710 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
2b720 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
2b730 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
2b740 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
2b750 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
2b760 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
2b770 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
2b780 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b790 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2b7a0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7c0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
2b7d0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
2b7e0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
2b7f0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
2b800 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
2b810 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
2b820 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
2b830 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
2b840 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
2b850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b860 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b870 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
2b880 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2b890 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
2b8a0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
2b8b0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
2b8c0 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
2b8d0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2b8e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2b8f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
2b900 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
2b910 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2b920 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
2b930 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
2b940 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
2b950 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2b960 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2b970 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
2b980 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
2b990 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
2b9a0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
2b9b0 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
2b9c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
2b9d0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2b9e0 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
2b9f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2ba00 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2ba10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ba20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ba30 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
2ba40 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2ba50 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ) ){.    const i
2ba60 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49  nt flags =  SQLI
2ba70 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
2ba80 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL | SQLITE_OPEN
2ba90 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20  _READWRITE .    
2baa0 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
2bab0 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
2bac0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a  OPEN_EXCLUSIVE .
2bad0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
2bae0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2baf0 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74  E;.    int nStmt
2bb00 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43  Spill = sqlite3C
2bb10 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c  onfig.nStmtSpill
2bb20 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
2bb30 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2bb40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2bb50 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
2bb60 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
2bb70 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70  ){.      nStmtSp
2bb80 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ill = -1;.    }.
2bb90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2bba0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
2bbb0 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61  er->pVfs, 0, pPa
2bbc0 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73  ger->sjfd, flags
2bbd0 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20  , nStmtSpill);. 
2bbe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2bbf0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
2bc00 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
2bc10 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
2bc20 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
2bc30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
2bc40 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2bc50 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
2bc60 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2bc70 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
2bc80 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
2bc90 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
2bca0 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
2bcb0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
2bcc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2bcd0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
2bce0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2bcf0 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
2bd00 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
2bd10 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
2bd20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
2bd30 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
2bd40 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
2bd50 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
2bd60 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
2bd70 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
2bd80 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
2bd90 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
2bda0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2bdb0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2bdc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2bdd0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
2bde0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2bdf0 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
2be00 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2be10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2be20 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
2be30 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2be40 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
2be50 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
2be60 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
2be70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2be80 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2be90 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2bea0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2beb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2bec0 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
2bed0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2bee0 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
2bef0 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
2bf00 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
2bf10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2bf20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
2bf30 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  eInJournal(pPage
2bf40 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20  r, pPg) .       
2bf50 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
2bf60 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2bf70 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
2bf80 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2bf90 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
2bfa0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
2bfb0 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
2bfc0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
2bfd0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
2bfe0 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
2bff0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
2c000 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
2c010 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2c020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c030 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
2c040 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2c050 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2c060 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d  t = (i64)pPager-
2c070 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
2c080 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
2c090 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2c0a0 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  2;..#if SQLITE_H
2c0b0 41 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20  AS_CODEC   .    
2c0c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
2c0d0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2c0e0 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2c0f0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
2c100 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
2c110 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2c120 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  KPT, pData2);.  
2c130 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2c140 0a 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20  .      pData2 = 
2c150 70 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47  pData;.      PAG
2c160 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
2c170 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
2c180 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2c190 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2c1a0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
2c1b0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2c1c0 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
2c1d0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2c1e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c1f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c200 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2c210 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
2c220 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
2c230 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
2c240 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+4);.      }. 
2c250 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2c260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c270 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
2c280 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
2c290 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
2c2a0 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
2c2b0 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
2c2c0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
2c2d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2c2e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c2f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2c300 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
2c310 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29  ired(PgHdr *pPg)
2c320 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75  {.  if( subjRequ
2c330 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2c340 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a  .    return subj
2c350 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2c360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2c370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c380 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2c390 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2c3a0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2c3b0 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2c3c0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2c3d0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2c3e0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2c3f0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2c400 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2c410 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2c420 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2c430 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2c440 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2c450 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2c460 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2c470 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2c480 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2c490 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2c4a0 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2c4b0 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2c4c0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2c4d0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2c4e0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2c4f0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2c500 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2c510 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2c520 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2c530 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2c540 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2c550 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2c560 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2c570 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2c580 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2c590 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2c5a0 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2c5b0 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2c5c0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2c5d0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2c5e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2c5f0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2c600 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2c610 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2c620 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2c630 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2c640 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2c650 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2c660 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2c670 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2c680 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2c690 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2c6a0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2c6b0 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2c6c0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2c6d0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2c6e0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2c6f0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2c700 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2c710 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2c720 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2c730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2c740 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2c750 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2c760 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2c770 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2c780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c790 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2c7a0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2c7b0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2c7c0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2c7d0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2c7e0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
2c7f0 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20  SYNC bit is set 
2c800 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
2c810 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
2c820 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
2c830 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
2c840 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
2c850 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
2c860 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
2c870 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
2c880 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
2c890 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
2c8a0 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
2c8b0 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
2c8c0 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
2c8d0 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
2c8e0 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
2c8f0 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f  l ROLLBACK and O
2c900 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73  FF bits inhibits
2c910 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2c920 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c  ing.  ** regardl
2c930 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2c940 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2c950 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2c960 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20  is set during.  
2c970 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ** a rollback or
2c980 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74   by user request
2c990 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
2c9a0 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2c9b0 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2c9c0 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2c9d0 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2c9e0 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2c9f0 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2ca00 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2ca10 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2ca20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ca30 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
2ca40 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
2ca50 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2ca60 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
2ca70 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a  h createFlag==3.
2ca80 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
2ca90 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
2caa0 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
2cab0 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
2cac0 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
2cad0 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
2cae0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
2caf0 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
2cb00 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
2cb10 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
2cb20 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2cb30 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
2cb40 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
2cb50 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
2cb60 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2cb70 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2cb80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65   SQLITE_OK;.  te
2cb90 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2cba0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2cbb0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
2cbc0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2cbd0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2cbe0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  l & SPILLFLAG_OF
2cbf0 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  F );.  testcase(
2cc00 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2cc10 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2cc20 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20  NOSYNC );.  if( 
2cc30 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2cc40 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65  ll.   && ((pPage
2cc50 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2cc60 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  (SPILLFLAG_ROLLB
2cc70 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  ACK|SPILLFLAG_OF
2cc80 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20  F))!=0.      || 
2cc90 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
2cca0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
2ccb0 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2ccc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ccd0 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74  }..  pPager->aSt
2cce0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 53 50  at[PAGER_STAT_SP
2ccf0 49 4c 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e 70  ILL]++;.  pPg->p
2cd00 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28  Dirty = 0;.  if(
2cd10 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2cd20 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ger) ){.    /* W
2cd30 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
2cd40 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
2cd50 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
2cd60 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
2cd70 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2cd80 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66  ed(pPg); .    if
2cd90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cda0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2cdb0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
2cdc0 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
2cdd0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2cde0 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
2cdf0 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
2ce00 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2ce10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
2ce20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
2ce30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2ce40 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
2ce50 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2ce60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ce70 4b 20 29 20 72 65 74 75 72 6e 20 70 61 67 65 72  K ) return pager
2ce80 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2ce90 63 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  c);.    }.#endif
2cea0 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  .  .    /* Sync 
2ceb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cec0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2ced0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
2cee0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2cef0 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  YNC .     || pPa
2cf00 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2cf10 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
2cf20 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OD.    ){.      
2cf30 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
2cf40 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
2cf50 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
2cf60 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2cf70 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
2cf80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2cf90 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
2cfa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cfb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2cfc0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2cfd0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2cfe0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
2cff0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
2d000 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  st(pPager, pPg);
2d010 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2d020 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
2d030 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
2d040 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d050 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2d060 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
2d070 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2d080 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2d090 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
2d0a0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2d0b0 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
2d0c0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2d0d0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20  or(pPager, rc); 
2d0e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
2d0f0 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64  all unreferenced
2d100 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2d110 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
2d120 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 50  ite3PagerFlush(P
2d130 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2d140 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72   int rc = pPager
2d150 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28  ->errCode;.  if(
2d160 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50   !MEMDB ){.    P
2d170 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
2d180 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2d190 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2d1a0 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ache);.    asser
2d1b0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2d1c0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2d1d0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
2d1e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2d1f0 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  st ){.      PgHd
2d200 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
2d210 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
2d220 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d  if( pList->nRef=
2d230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2d240 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28 28   = pagerStress((
2d250 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c  void*)pPager, pL
2d260 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
2d270 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
2d280 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2d290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2d2a0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
2d2b0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2d2c0 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
2d2d0 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
2d2e0 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
2d2f0 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
2d300 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
2d310 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2d320 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2d330 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2d340 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2d350 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2d360 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2d370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d380 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2d390 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2d3a0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2d3b0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2d3c0 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2d3d0 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2d3e0 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2d3f0 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2d400 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2d410 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2d420 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2d430 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2d440 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2d450 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2d460 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2d470 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2d480 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2d490 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2d4a0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2d4b0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2d4c0 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2d4d0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2d4e0 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2d4f0 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2d500 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2d510 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2d520 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2d530 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2d540 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2d550 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2d560 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2d570 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2d580 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2d590 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65   API.  When a ne
2d5a0 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61  w page is alloca
2d5b0 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73  ted, the.** firs
2d5c0 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 69  t 8 bytes of thi
2d5d0 73 20 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f  s space are zero
2d5e0 65 64 20 62 75 74 20 74 68 65 20 72 65 6d 61 69  ed but the remai
2d5f0 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61  nder is uninitia
2d600 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65  lized..** (The e
2d610 78 74 72 61 20 73 70 61 63 65 20 69 73 20 75 73  xtra space is us
2d620 65 64 20 62 79 20 62 74 72 65 65 20 61 73 20 74  ed by btree as t
2d630 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
2d640 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  t.).**.** The fl
2d650 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2d660 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2d670 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2d680 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2d690 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2d6a0 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2d6b0 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2d6c0 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2d6d0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2d6e0 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2d6f0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2d700 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2d710 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2d720 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2d730 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2d740 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2d750 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2d760 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2d770 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2d780 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2d790 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2d7a0 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2d7b0 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2d7c0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2d7d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2d7e0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2d7f0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2d800 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2d810 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2d820 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2d830 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2d840 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2d850 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2d860 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2d870 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2d880 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2d890 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2d8a0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2d8b0 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2d8c0 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2d8d0 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2d8e0 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2d8f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2d900 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2d910 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2d920 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2d930 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2d940 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2d950 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2d960 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2d970 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2d980 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2d990 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2d9a0 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2d9b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d9c0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2d9d0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2d9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2d9f0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2da00 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2da10 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2da20 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2da30 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2da40 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2da50 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2da60 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2da70 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2da80 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2da90 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2daa0 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2dab0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2dac0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2dad0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2dae0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2daf0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2db00 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2db10 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2db20 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2db30 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2db40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2db50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2db60 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2db70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2db80 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2db90 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2dba0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2dbb0 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2dbc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2dbd0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2dbe0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2dbf0 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  le */.#ifdef SQL
2dc00 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
2dc10 49 41 4c 49 5a 45 0a 20 20 69 6e 74 20 6d 65 6d  IALIZE.  int mem
2dc20 4a 4d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  JM = 0;         
2dc30 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6a 6f 75 72    /* Memory jour
2dc40 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 65 6c 73  nal mode */.#els
2dc50 65 0a 23 20 64 65 66 69 6e 65 20 6d 65 6d 4a 4d  e.# define memJM
2dc60 20 30 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20   0.#endif.  int 
2dc70 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
2dc80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2dc90 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
2dca0 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
2dcb0 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
2dcc0 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
2dcd0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2dce0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
2dcf0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
2dd00 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
2dd10 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
2dd20 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2dd30 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
2dd40 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
2dd50 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2dd60 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
2dd70 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
2dd80 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
2dd90 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
2dda0 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
2ddb0 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
2ddc0 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
2ddd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2dde0 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
2ddf0 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2de00 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
2de10 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u32 szPageDflt =
2de20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2de30 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
2de40 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2de50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2de60 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f   *zUri = 0;    /
2de70 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f  * URI args to co
2de80 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69  py */.  int nUri
2de90 42 79 74 65 20 3d 20 31 3b 20 20 20 20 20 20 20  Byte = 1;       
2dea0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2deb0 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20  tes of URI args 
2dec0 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 23 69 66 64  at *zUri */.#ifd
2ded0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2dee0 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2def0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2df00 6d 62 65 72 20 6f 66 20 55 52 49 20 70 61 72 61  mber of URI para
2df10 6d 65 74 65 72 73 20 2a 2f 0a 23 65 6e 64 69 66  meters */.#endif
2df20 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
2df30 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
2df40 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
2df50 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
2df60 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
2df70 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
2df80 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
2df90 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
2dfa0 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a  sub-journal).  *
2dfb0 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  /.  journalFileS
2dfc0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2dfd0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2dfe0 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65  pVfs));..  /* Se
2dff0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2e000 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2e010 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2e020 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2e030 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2e040 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2e050 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2e060 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2e070 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2e080 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  = 1;.    if( zFi
2e090 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2e0a0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ame[0] ){.      
2e0b0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2e0c0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a  te3DbStrDup(0, z
2e0d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2e0e0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2e0f0 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0  ) return SQLI
2e100 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2e110 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d       nPathname =
2e120 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2e130 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2e140 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
2e150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2e160 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  if..  /* Compute
2e170 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
2e180 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
2e190 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
2e1a0 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
2e1b0 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
2e1c0 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
2e1d0 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
2e1e0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2e1f0 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
2e200 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
2e210 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
2e220 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
2e230 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2e240 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2e250 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2e260 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2e270 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
2e280 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
2e290 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ame = sqlite3DbM
2e2a0 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74  allocRaw(0, nPat
2e2b0 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2e2c0 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2e2d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2e2e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2e2f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74  ;.    }.    zPat
2e300 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
2e310 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
2e320 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
2e330 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
2e340 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ils */.    rc = 
2e350 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
2e360 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
2e370 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
2e380 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2e390 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2e3a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2e3b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  athname);.    z 
2e3c0 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e  = zUri = &zFilen
2e3d0 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
2e3e0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
2e3f0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  ];.    while( *z
2e400 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73   ){.      z += s
2e410 74 72 6c 65 6e 28 7a 29 2b 31 3b 0a 20 20 20 20  trlen(z)+1;.    
2e420 20 20 7a 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29    z += strlen(z)
2e430 2b 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  +1;.#ifdef SQLIT
2e440 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 6e 55  E_DEBUG.      nU
2e450 72 69 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ri++;.#endif.   
2e460 20 7d 0a 20 20 20 20 6e 55 72 69 42 79 74 65 20   }.    nUriByte 
2e470 3d 20 28 69 6e 74 29 28 26 7a 5b 32 5d 20 2d 20  = (int)(&z[2] - 
2e480 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2e490 74 28 20 6e 55 72 69 42 79 74 65 3e 3d 31 20 29  t( nUriByte>=1 )
2e4a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2e4b0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
2e4c0 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
2e4d0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
2e4e0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2e4f0 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
2e500 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
2e510 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2e520 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2e530 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
2e540 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
2e550 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2e560 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2e570 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
2e580 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
2e590 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
2e5a0 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
2e5b0 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
2e5c0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
2e5d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2e5e0 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
2e5f0 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
2e600 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
2e610 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
2e620 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2e630 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2e640 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2e650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e660 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e670 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2e680 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
2e690 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2e6a0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
2e6b0 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
2e6c0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
2e6d0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
2e6e0 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
2e6f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2e700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e710 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
2e720 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
2e730 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
2e740 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
2e750 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2e760 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
2e770 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2e780 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
2e790 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
2e7a0 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
2e7b0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2e7c0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2e7d0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
2e7e0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2e7f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
2e800 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
2e810 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
2e820 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
2e830 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2e840 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
2e850 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2e860 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2e870 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
2e880 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2e890 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2e8a0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2e8b0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
2e8c0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2e8d0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
2e8e0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
2e8f0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2e910 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
2e920 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
2e930 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
2e940 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
2e950 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2e960 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
2e970 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2e980 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2e990 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
2e9a0 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
2e9b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
2e9c0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2e9d0 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
2e9e0 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
2e9f0 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
2ea00 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
2ea10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2ea20 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
2ea30 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
2ea40 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 42 79 74  me + 1 + nUriByt
2ea50 65 20 2b 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65  e +     /* zFile
2ea60 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
2ea70 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20  hname + 8 + 2   
2ea80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
2ea90 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
2eaa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2eab0 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
2eac0 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20  e + 4 + 2       
2ead0 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a       /* zWal */.
2eae0 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73  #endif.  );.  as
2eaf0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2eb00 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
2eb10 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
2eb20 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
2eb30 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
2eb40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2eb50 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2eb60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2eb70 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2eb80 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
2eba0 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
2ebb0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
2ebc0 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
2ebd0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
2ebe0 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
2ebf0 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
2ec00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2ec10 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2ec20 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
2ec30 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
2ec40 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2ec50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
2ec60 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
2ec70 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
2ec80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2ec90 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2eca0 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
2ecb0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
2ecc0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2ecd0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2ece0 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
2ecf0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2ed00 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
2ed10 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2ed20 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
2ed30 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
2ed40 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
2ed50 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
2ed60 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
2ed70 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
2ed80 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a   nPathname>0 );.
2ed90 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2eda0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
2edb0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2edc0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72  me);.    if( nUr
2edd0 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67  i ) memcpy(&pPag
2ede0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
2edf0 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69  athname+1], zUri
2ee00 2c 20 6e 55 72 69 42 79 74 65 29 3b 0a 20 20 20  , nUriByte);.   
2ee10 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2ee20 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2ee30 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2ee40 2b 20 31 20 2b 20 6e 55 72 69 42 79 74 65 29 3b  + 1 + nUriByte);
2ee50 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2ee60 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2ee70 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2ee80 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2ee90 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2eea0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2eeb0 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20  journal", 8);.  
2eec0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2eed0 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2eee0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2eef0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2ef00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2ef10 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2ef20 57 61 6c 20 3d 20 28 63 68 61 72 2a 29 28 70 50  Wal = (char*)(pP
2ef30 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2ef40 2b 20 38 20 2b 20 32 29 3b 0a 20 20 20 20 6d 65  + 8 + 2);.    me
2ef50 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61  mcpy(pPager->zWa
2ef60 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2ef70 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2ef80 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57  mcpy(&pPager->zW
2ef90 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2efa0 2d 77 61 6c 22 2c 20 34 29 3b 0a 20 20 20 20 73  -wal", 4);.    s
2efb0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2efc0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2efd0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2efe0 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
2eff0 73 71 6c 69 74 65 33 55 72 69 43 6f 75 6e 74 28  sqlite3UriCount(
2f000 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3d 3d 30  pPager->zWal)==0
2f010 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61   );.#endif.    a
2f020 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 55 72  ssert( sqlite3Ur
2f030 69 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 7a  iCount(pPager->z
2f040 46 69 6c 65 6e 61 6d 65 29 3d 3d 6e 55 72 69 20  Filename)==nUri 
2f050 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
2f060 71 6c 69 74 65 33 55 72 69 43 6f 75 6e 74 28 70  qlite3UriCount(p
2f070 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
2f080 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
2f090 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2f0a0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
2f0b0 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
2f0c0 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
2f0d0 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
2f0e0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
2f0f0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
2f100 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2f110 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2f120 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  ] ){.    int fou
2f130 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2f140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
2f150 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2f160 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
2f170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f180 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2f190 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2f1a0 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
2f1b0 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
2f1c0 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29  assert( !memDb )
2f1d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2f1e0 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
2f1f0 5a 45 0a 20 20 20 20 6d 65 6d 4a 4d 20 3d 20 28  ZE.    memJM = (
2f200 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2f210 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e  _MEMORY)!=0;.#en
2f220 64 69 66 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  dif.    readOnly
2f230 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2f240 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 21 3d  OPEN_READONLY)!=
2f250 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
2f260 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2f270 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2f280 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2f290 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2f2a0 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2f2b0 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2f2c0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2f2d0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2f2e0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2f2f0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2f300 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2f310 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2f320 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2f330 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f340 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2f350 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2f360 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2f370 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2f380 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2f390 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2f3a0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2f3b0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2f3c0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2f3d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f3e0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2f3f0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2f400 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2f410 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66  r->fd);.      if
2f420 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  ( !readOnly ){. 
2f430 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72         setSector
2f440 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2f450 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2f460 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2f470 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2f480 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f490 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  IZE);.        if
2f4a0 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2f4b0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2f4c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2f4d0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2f4e0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2f4f0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f510 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2f520 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f530 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2f540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f550 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2f560 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2f570 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2f580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f590 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2f5a0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2f5b0 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
2f5c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2f5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2f5e0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2f5f0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2f600 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2f610 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2f620 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2f630 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2f640 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2f650 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f660 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2f670 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2f680 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2f690 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2f6a0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f6b0 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2f6c0 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2f6d0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2f6e0 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2f6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2f700 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2f710 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f730 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2f740 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2f750 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65  >noLock = sqlite
2f760 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2f770 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b  ilename, "nolock
2f780 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
2f790 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49   (iDc & SQLITE_I
2f7a0 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21  OCAP_IMMUTABLE)!
2f7b0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
2f7c0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2f7d0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d  (zFilename, "imm
2f7e0 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20  utable", 0) ){. 
2f7f0 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67           vfsFlag
2f800 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2f810 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2f820 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69       goto act_li
2f830 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20  ke_temp_file;.  
2f840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2f850 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2f860 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2f870 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2f880 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2f890 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2f8a0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2f8b0 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2f8c0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2f8d0 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2f8e0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2f8f0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2f900 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2f910 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2f920 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2f930 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2f940 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2f950 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2f960 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2f970 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2f980 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2f990 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2f9a0 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2f9b0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2f9c0 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2f9d0 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2f9e0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  ournal..    **. 
2f9f0 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2fa00 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20  h also runs for 
2fa10 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20  files marked as 
2fa20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a  immutable..    *
2fa30 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  / .act_like_temp
2fa40 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46  _file:.    tempF
2fa50 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2fa60 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2fa70 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20  GER_READER;     
2fa80 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c  /* Pretend we al
2fa90 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
2faa0 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  k */.    pPager-
2fab0 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2fac0 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50  VE_LOCK;    /* P
2fad0 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e  retend we are in
2fae0 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20   EXCLUSIVE mode 
2faf0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2fb00 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2fb10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2fb20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2fb30 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2fb40 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2fb50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2fb60 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2fb70 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2fb80 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2fb90 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2fba0 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2fbb0 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2fbc0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2fbd0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2fbe0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2fbf0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2fc00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2fc10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2fc20 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2fc30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2fc40 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2fc50 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2fc60 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2fc70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fc80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
2fc90 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2fca0 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2fcb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fcc0 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20  K ){.    nExtra 
2fcd0 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
2fce0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  ;.    assert( nE
2fcf0 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72  xtra>=8 && nExtr
2fd00 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63  a<1000 );.    rc
2fd10 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2fd20 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2fd30 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2fd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fd50 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
2fd60 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
2fd70 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
2fd80 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2fd90 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2fda0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61  error occurred a
2fdb0 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20  bove, free the  
2fdc0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2fdd0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2fde0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2fdf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fe00 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2fe10 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2fe20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
2fe30 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
2fe40 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  Space);.    sqli
2fe50 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
2fe60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2fe70 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2fe80 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2fe90 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2fea0 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2feb0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2fec0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2fed0 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2fee0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2fef0 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2ff00 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2ff10 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2ff20 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2ff30 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2ff40 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2ff50 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2ff60 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2ff70 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ff80 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2ff90 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ffa0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2ffb0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2ffc0 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
2ffd0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
2ffe0 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
2fff0 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
30000 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
30010 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
30020 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
30030 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
30040 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
30050 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
30060 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
30070 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
30080 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
30090 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
300a0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
300b0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
300c0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
300d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
300e0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
300f0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
30100 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
30110 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
30120 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
30130 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
30140 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
30150 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
30160 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
30170 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
30180 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
30190 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
301a0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
301b0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
301c0 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
301d0 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  empFile;.  if( p
301e0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
301f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
30200 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30  ger->fullSync==0
30210 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30220 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
30230 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
30240 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  rt( pPager->sync
30250 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
30260 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30270 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  walSyncFlags==0 
30280 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30290 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
302a0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
302b0 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b  ->extraSync = 0;
302c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
302d0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
302e0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
302f0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
30300 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
30310 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53 51  YNC_NORMAL | (SQ
30320 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
30330 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  <<2);.  }.  /* p
30340 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
30350 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
30360 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
30370 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
30380 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
30390 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
303a0 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
303b0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
303c0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
303d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
303e0 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
303f0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
30400 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
30410 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
30420 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
30430 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
30440 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
30450 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
30460 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
30470 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
30480 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
30490 7c 7c 20 6d 65 6d 4a 4d 20 29 7b 0a 20 20 20 20  || memJM ){.    
304a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
304b0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
304c0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
304d0 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
304e0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
304f0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
30500 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
30510 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
30520 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
30530 20 78 52 65 69 6e 69 74 3b 0a 20 20 73 65 74 47   xReinit;.  setG
30540 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67  etterMethod(pPag
30550 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  er);.  /* memset
30560 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
30570 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
30580 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
30590 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  /* pPager->szMma
305a0 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  p = SQLITE_DEFAU
305b0 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20  LT_MMAP_SIZE // 
305c0 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62  will be set by b
305d0 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70  tree.c */..  *pp
305e0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
305f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30600 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54  OK;.}..../*.** T
30610 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30620 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
30630 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
30640 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
30650 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
30660 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
30670 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
30680 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
30690 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
306a0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
306b0 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
306c0 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
306d0 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
306e0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
306f0 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
30700 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
30710 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
30720 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
30730 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
30740 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
30750 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
30760 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
30770 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
30780 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
30790 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
307a0 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
307b0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
307c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
307d0 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
307e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
307f0 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
30800 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
30810 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
30820 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
30830 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
30840 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
30850 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
30860 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
30870 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
30880 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
30890 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
308a0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
308b0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
308c0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
308d0 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
308e0 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
308f0 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
30900 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
30910 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
30920 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
30930 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
30940 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
30950 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
30960 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
30970 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
30980 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
30990 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
309a0 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
309b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
309c0 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
309d0 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
309e0 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
309f0 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
30a00 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
30a10 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
30a20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30a30 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
30a40 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
30a50 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
30a60 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
30a70 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
30a80 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
30a90 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
30aa0 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
30ab0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
30ac0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
30ad0 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
30ae0 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
30af0 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
30b00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
30b10 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
30b20 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
30b30 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
30b40 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
30b50 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
30b60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
30b70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
30b80 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
30b90 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
30ba0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
30bb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
30bc0 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
30bd0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
30be0 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
30bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30c00 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
30c10 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
30c20 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
30c30 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
30c40 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
30c50 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
30c60 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
30c70 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
30c80 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
30c90 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
30ca0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
30cb0 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
30cc0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30cd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30ce0 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
30cf0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
30d00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30d10 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
30d20 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
30d30 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
30d40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30d50 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
30d60 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
30d70 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
30d80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
30d90 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
30da0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30db0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
30dc0 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
30dd0 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
30de0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
30df0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
30e00 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
30e10 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
30e20 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
30e30 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
30e40 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
30e50 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
30e60 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
30e70 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
30e80 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
30e90 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
30ea0 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
30eb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30ec0 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
30ed0 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
30ee0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
30ef0 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
30f00 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
30f10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
30f20 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
30f30 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
30f40 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
30f50 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
30f60 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
30f70 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
30f80 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
30f90 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
30fa0 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
30fb0 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
30fc0 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
30fd0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
30fe0 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
30ff0 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
31000 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
31010 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
31020 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
31030 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
31040 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
31050 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
31060 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
31070 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
31080 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
31090 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
310a0 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
310b0 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
310c0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
310d0 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
310e0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
310f0 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
31100 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
31110 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
31120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31130 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
31140 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
31150 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
31160 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31170 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
31180 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
31190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
311b0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
311c0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  ile */..      as
311d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
311e0 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  mpFile==0 );.   
311f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
31200 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
31210 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
31220 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31230 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
31240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
31250 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73   zero pages in s
31260 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ize, that means 
31270 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20  that either (1) 
31280 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
31290 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e  ournal is a remn
312a0 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ant from a prior
312b0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
312c0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65  he same name whe
312d0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
312e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
312f0 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72  but not the jour
31300 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c  nal was deleted,
31310 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74   or (2) the init
31320 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ial.        ** t
31330 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
31340 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20  populates a new 
31350 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e  database is bein
31360 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  g rolled back.. 
31370 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74         ** In eit
31380 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f  her case, the jo
31390 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62  urnal file can b
313a0 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65  e deleted.  Howe
313b0 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20  ver, take care. 
313c0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f         ** not to
313d0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
313e0 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
313f0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64  s already open d
31400 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ue to.        **
31410 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
31420 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a  RSIST..        *
31430 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  /.        if( nP
31440 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f  age==0 && !jrnlO
31450 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
31460 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
31470 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
31480 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
31490 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
314a0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
314b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
314c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
314d0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
314e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
314f0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
31500 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
31510 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
31520 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
31530 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
31540 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
31560 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
31570 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
31580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
315a0 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
315b0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
315c0 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
315d0 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
315e0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
315f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
31600 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
31610 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
31620 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
31630 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
31640 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
31650 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31660 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
31670 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
31680 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
31690 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
316a0 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
316b0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
316c0 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
316d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
316e0 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
316f0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
31700 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
31710 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
31720 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31730 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
31740 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31750 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
31760 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
31770 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
31780 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
31790 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
317a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
317b0 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
317c0 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
317d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
317e0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
317f0 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
31800 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
31810 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
31820 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
31830 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
31840 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31870 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
31880 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
31890 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
318a0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
318b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
318c0 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
318d0 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
318e0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
318f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31900 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
31910 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
31920 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
31930 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
31940 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
31950 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
31960 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
31970 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74  a zero header, t
31980 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65  hat might be due
31990 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   to an I/O error
319a0 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  , or.           
319b0 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
319c0 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20  due to the race 
319d0 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
319e0 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e  bed above and in
319f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31a00 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45  ticket #3883.  E
31a10 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d  ither way, assum
31a20 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
31a30 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20  al is hot..     
31a40 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d         ** This m
31a50 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20  ight be a false 
31a60 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69  positive.  But i
31a70 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
31a80 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
31a90 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e   automatic journ
31aa0 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20  al playback and 
31ab0 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69  recovery mechani
31ac0 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20  sm will deal.   
31ad0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68           ** with
31ae0 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43   it under an EXC
31af0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72  LUSIVE lock wher
31b00 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
31b10 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
31b20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68  ** worry so much
31b30 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69   with race condi
31b40 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  tions..         
31b50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
31b60 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
31b70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31ba0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
31bb0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
31bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
31bd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
31be0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ed to obtain a s
31bf0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
31c00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31c10 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
31c20 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
31c30 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74 69  3PagerGet() unti
31c40 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
31c50 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
31c60 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
31c70 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
31c80 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
31c90 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
31ca0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
31cb0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
31cc0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
31cd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
31ce0 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
31cf0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
31d00 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
31d10 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
31d20 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
31d30 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
31d40 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
31d50 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
31d60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
31d70 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
31d80 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
31d90 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
31da0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
31db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
31dc0 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
31dd0 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
31de0 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
31df0 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
31e00 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
31e10 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
31e20 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
31e30 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
31e40 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
31e50 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
31e60 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
31e70 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
31e80 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
31e90 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
31ea0 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
31eb0 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
31ec0 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
31ed0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31ee0 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
31ef0 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
31f00 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
31f10 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
31f20 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
31f30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
31f40 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
31f50 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
31f60 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
31f70 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
31f80 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
31f90 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
31fa0 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
31fb0 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
31fc0 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
31fd0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
31fe0 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
31ff0 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
32000 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
32010 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
32020 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
32030 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
32040 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
32050 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
32060 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
32070 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
32080 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
32090 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
320a0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
320b0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
320c0 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
320d0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
320e0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a  rnal file or .**
320f0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
32100 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
32110 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
32120 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
32130 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
32140 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
32150 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
32160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32180 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
32190 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
321a0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
321b0 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
321c0 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
321d0 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
321e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
321f0 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20  s. This implies 
32200 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73  that the pager s
32210 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68  tate should eith
32220 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20  er.  ** be OPEN 
32230 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45  or READER. READE
32240 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  R is only possib
32250 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20  le if the pager 
32260 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20  is or was in .  
32270 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
32280 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20  ess mode.  */.  
32290 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
322a0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
322b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
322c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
322d0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
322e0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
322f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32300 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
32310 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
32320 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
32330 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
32340 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
32350 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
32360 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
32370 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
32380 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32390 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e  R_OPEN ){.    in
323a0 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20  t bHotJournal = 
323b0 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  1;          /* T
323c0 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69  rue if there exi
323d0 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  sts a hot journa
323e0 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61  l-file */..    a
323f0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
32400 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
32410 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
32420 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
32430 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
32440 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  K );..    rc = p
32450 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
32460 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
32470 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
32480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
324a0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
324b0 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
324c0 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
324d0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f  LOCK );.      go
324e0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
324f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
32500 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
32510 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
32520 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
32530 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
32540 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
32550 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
32560 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
32570 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
32580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32590 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
325a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
325b0 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
325c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
325d0 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
325e0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
325f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32600 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32610 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
32620 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
32630 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72     if( pPager->r
32640 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
32650 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
32660 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
32670 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
32680 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
32690 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
326a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
326b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
326c0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
326d0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
326e0 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
326f0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
32700 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
32710 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
32720 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
32730 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
32740 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
32750 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
32760 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
32770 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
32780 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
32790 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
327a0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
327b0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
327c0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
327d0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
327e0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
327f0 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
32800 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
32810 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
32820 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
32830 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
32840 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
32850 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
32860 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
32870 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
32880 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
32890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
328a0 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
328b0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
328c0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
328d0 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
328e0 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
328f0 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
32900 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
32910 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
32920 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
32930 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
32940 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
32950 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
32960 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20  the lock is.    
32970 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20    ** downgraded 
32980 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62  to SHARED_LOCK b
32990 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
329a0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20  ion returns..   
329b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
329c0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
329d0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
329e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
329f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32a00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
32a10 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  iled;.      }. .
32a20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
32a30 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
32a40 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  en and the file 
32a50 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
32a60 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  open the .      
32a70 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  ** journal for r
32a80 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
32a90 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69  . Write access i
32aa0 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
32ab0 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  se .      ** in 
32ac0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
32ad0 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
32ae0 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
32af0 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20  e kept open .   
32b00 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62     ** and possib
32b10 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
32b20 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
32b30 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d  on. Also, write-
32b40 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  access .      **
32b50 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75   is usually requ
32b60 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ired to finalize
32b70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   the journal in 
32b80 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72  journal_mode=per
32b90 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  sist .      ** m
32ba0 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f  ode (and also fo
32bb0 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74  r journal_mode=t
32bc0 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20  runcate on some 
32bd0 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20  systems)..      
32be0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
32bf0 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
32c00 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
32c10 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
32c20 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20   some .      ** 
32c30 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
32c40 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
32c50 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
32c60 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
32c70 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
32c80 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
32c90 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
32ca0 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
32cb0 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
32cc0 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
32cd0 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
32ce0 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
32cf0 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
32d00 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
32d10 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
32d20 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
32d30 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
32d40 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
32d50 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
32d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
32d70 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
32d80 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
32d90 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69          int bExi
32da0 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
32db0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
32dc0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
32dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
32de0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
32df0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
32e00 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
32e10 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
32e20 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78  ESS_EXISTS, &bEx
32e30 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69  ists);.        i
32e40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32e50 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20   && bExists ){. 
32e60 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
32e70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
32e80 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
32e90 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
32ea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
32eb0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
32ec0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
32ed0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
32ee0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32ef0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
32f00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
32f10 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
32f20 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
32f30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
32f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
32f50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32f60 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
32f70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32f80 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
32f90 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
32fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
32fb0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
32fc0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
32fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
32fe0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
32ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
33000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33010 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
33020 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
33030 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
33040 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
33050 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
33060 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
33070 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
33080 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
33090 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
330a0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
330b0 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
330c0 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
330d0 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
330e0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
330f0 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
33100 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
33110 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
33120 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
33130 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
33140 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
33150 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
33160 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
33170 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
33180 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
33190 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
331a0 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
331b0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
331c0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
331d0 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
331e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
331f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
33200 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
33210 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
33220 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
33230 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
33240 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
33250 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
33260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33270 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
33280 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
33290 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  r, !pPager->temp
332a0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
332b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
332c0 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
332d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
332e0 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
332f0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
33300 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
33310 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
33320 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
33330 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33340 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33350 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
33360 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
33370 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
33380 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
33390 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
333a0 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
333b0 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
333c0 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
333d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
333e0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
333f0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
33400 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
33410 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
33420 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
33430 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
33440 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
33450 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
33460 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
33470 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
33480 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
33490 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
334a0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
334b0 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
334c0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
334d0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
334e0 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
334f0 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
33500 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
33510 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
33520 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
33530 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
33540 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
33550 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
33560 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
33570 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
33580 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
33590 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
335a0 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
335b0 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
335c0 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
335d0 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
335e0 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
335f0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
33600 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
33610 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
33620 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
33630 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
33640 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
33650 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
33660 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
33670 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
33680 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
33690 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
336a0 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
336b0 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
336c0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
336d0 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
336e0 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
336f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
33700 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
33710 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
33720 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
33730 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
33740 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
33750 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
33760 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
33770 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33780 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
33790 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
337a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
337b0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
337c0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
337d0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
337e0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
337f0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
33800 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
33810 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
33820 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72  mpFile && pPager
33830 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
33840 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
33850 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
33860 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
33870 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63  quired then chec
33880 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
33890 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
338a0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
338b0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
338c0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
338d0 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  d,.      ** flus
338e0 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
338f0 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  e hasHeldSharedL
33900 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74  ock flag prevent
33910 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  s this from.    
33920 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f    ** occurring o
33930 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  n the very first
33940 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c   access to a fil
33950 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  e, in order to s
33960 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ave a.      ** s
33970 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72  ingle unnecessar
33980 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  y sqlite3OsRead(
33990 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74  ) call at the st
339a0 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a  art-up..      **
339b0 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
339c0 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64  se changes are d
339d0 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
339e0 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
339f0 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
33a00 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
33a10 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
33a20 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
33a30 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
33a40 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
33a50 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
33a60 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
33a70 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
33a80 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
33a90 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
33aa0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
33ab0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
33ac0 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
33ad0 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
33ae0 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
33af0 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
33b00 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
33b10 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
33b20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
33b30 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
33b40 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
33b50 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
33b60 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
33b70 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
33b80 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
33b90 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
33ba0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  */.      char db
33bb0 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
33bc0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
33bd0 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54  rs)];..      IOT
33be0 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
33bf0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
33c00 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
33c10 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  s)));.      rc =
33c20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
33c30 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
33c40 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
33c50 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
33c60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
33c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33c80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33c90 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
33ca0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
33cb0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
33cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33cd0 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
33ce0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
33cf0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
33d00 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
33d10 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
33d20 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
33d30 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
33d40 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
33d50 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
33d60 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
33d70 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
33d80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33d90 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
33da0 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
33db0 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
33dc0 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
33dd0 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
33de0 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
33df0 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
33e00 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
33e10 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
33e20 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
33e30 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
33e40 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
33e50 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
33e60 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
33e70 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
33e80 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
33e90 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
33ea0 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
33eb0 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
33ec0 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
33ed0 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
33ee0 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
33ef0 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
33f00 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
33f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45  .        if( USE
33f20 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b  FETCH(pPager) ){
33f30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
33f40 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
33f50 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
33f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33f70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
33f80 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
33f90 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
33fa0 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
33fb0 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
33fc0 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
33fd0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
33fe0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
33ff0 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
34000 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
34010 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
34020 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
34030 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
34040 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
34050 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
34060 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
34070 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
34080 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
34090 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
340a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
340b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
340c0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
340d0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
340e0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
340f0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
34100 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70  tempFile==0 && p
34110 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34120 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
34130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34140 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
34150 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
34160 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
34170 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
34180 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34190 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
341a0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
341b0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
341c0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
341d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
341e0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
341f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
34200 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
34210 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
34220 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
34230 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  aredLock = 1;.  
34240 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
34250 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
34260 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
34270 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
34280 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
34290 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
342a0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
342b0 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
342c0 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
342d0 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
342e0 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
342f0 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
34300 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
34310 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
34320 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
34330 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
34340 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
34350 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
34360 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
34370 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
34380 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
34390 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
343a0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71  Pager){.  if( sq
343b0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
343c0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
343d0 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  che)==0 ){.    a
343e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
343f0 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a  MmapOut==0 ); /*
34400 20 62 65 63 61 75 73 65 20 70 61 67 65 31 20 69   because page1 i
34410 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d  s never memory m
34420 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67  apped */.    pag
34430 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
34440 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
34450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
34460 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  ge getter method
34470 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61 63  s each try to ac
34480 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
34490 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77  e to a.** page w
344a0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ith page number 
344b0 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71  pgno. If the req
344c0 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
344d0 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
344e0 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
344f0 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
34500 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
34510 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
34520 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64  *.** There are d
34530 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65  ifferent impleme
34540 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
34550 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65  getter method de
34560 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  pending.** on th
34570 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
34580 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  of the pager..**
34590 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e  .**     getPageN
345a0 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20  ormal()         
345b0 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67  --  The normal g
345c0 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74  etter.**     get
345d0 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20 20  PageError()     
345e0 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66       --  Used if
345f0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
34600 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a   an error state.
34610 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d  **     getPageMm
34620 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20 2d  ap()           -
34630 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72  -  Used if memor
34640 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20  y-mapped I/O is 
34650 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66  enabled.**.** If
34660 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
34670 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
34680 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
34690 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
346a0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
346b0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
346c0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
346d0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
346e0 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
346f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34700 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
34710 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
34720 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
34730 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
34740 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
34750 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
34760 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
34770 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
34780 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
34790 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
347a0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
347b0 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
347c0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
347d0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
347e0 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
347f0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
34800 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
34810 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
34820 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
34830 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
34840 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
34850 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
34860 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
34870 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
34880 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
34890 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
348a0 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
348b0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
348c0 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
348d0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
348e0 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
348f0 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20  f .** the flags 
34900 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
34910 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  ns the PAGER_GET
34920 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61  _NOCONTENT bit a
34930 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
34940 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
34950 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
34960 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
34970 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
34980 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
34990 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
349a0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
349b0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
349c0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
349d0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
349e0 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45  *.** If PAGER_GE
349f0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74  T_NOCONTENT is t
34a00 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
34a10 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
34a20 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
34a30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
34a40 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
34a50 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
34a60 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
34a70 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
34a80 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
34a90 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
34aa0 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
34ab0 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
34ac0 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
34ad0 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
34ae0 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
34af0 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
34b00 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
34b10 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
34b20 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
34b30 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
34b40 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
34b50 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45  l..**.** If PAGE
34b60 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
34b70 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
34b80 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
34b90 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
34ba0 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65  d.** of being re
34bb0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
34bc0 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
34bd0 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
34be0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
34bf0 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
34c00 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
34c10 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
34c20 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
34c30 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
34c40 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
34c50 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
34c60 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
34c70 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
34c80 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
34c90 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
34ca0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
34cb0 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
34cc0 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
34cd0 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
34ce0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
34cf0 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
34d00 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
34d10 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
34d20 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
34d30 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
34d40 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
34d50 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
34d60 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
34d70 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
34d80 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
34d90 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
34da0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
34db0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
34dc0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
34dd0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
34de0 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
34df0 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
34e00 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
34e10 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
34e20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
34e30 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
34e40 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
34e50 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
34e60 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
34e70 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
34e80 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
34e90 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
34ea0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
34eb0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
34ec0 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
34ed0 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
34ee0 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
34ef0 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
34f00 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
34f10 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
34f20 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
34f30 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
34f40 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
34f50 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
34f60 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
34f70 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
34f80 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73  rnal files..*/.s
34f90 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
34fa0 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72  eNormal(.  Pager
34fb0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
34fc0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
34fd0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34fe0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
34ff0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
35000 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
35010 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
35020 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
35030 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
35040 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
35050 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
35060 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
35070 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
35080 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
35090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
350a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
350b0 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20  u8 noContent;   
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350d0 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45 52  /* True if PAGER
350e0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
350f0 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74  s set */.  sqlit
35100 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
35110 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74  pBase;..  assert
35120 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
35130 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
35140 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35150 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
35160 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
35170 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
35180 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
35190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
351a0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
351b0 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69  dLock==1 );..  i
351c0 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
351d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
351e0 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65  PT_BKPT;.  pBase
351f0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
35200 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
35210 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
35220 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20  .  if( pBase==0 
35230 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
35240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35250 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
35260 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
35270 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29  e, pgno, &pBase)
35280 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
35290 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
352a0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
352b0 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 3d  ;.    if( pBase=
352c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
352d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
352e0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
352f0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
35310 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
35320 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
35330 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
35340 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
35350 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ase);.  assert( 
35360 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29  pPg==(*ppPage) )
35370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
35380 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
35390 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
353a0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
353b0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
353c0 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d  ;..  noContent =
353d0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
353e0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d  GET_NOCONTENT)!=
353f0 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  0;.  if( pPg->pP
35400 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
35410 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
35420 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
35430 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
35440 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
35450 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
35460 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
35470 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
35480 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
35490 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
354a0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
354b0 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
354c0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
354d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
354e0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
354f0 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
35500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
35510 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
35520 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
35530 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
35540 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
35550 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
35560 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
35570 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65  . But first some
35580 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20   error checks:. 
35590 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29     **.    ** (1)
355a0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
355b0 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
355c0 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65  .    ** (2) Neve
355d0 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74  r try to fetch t
355e0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a  he locking page.
355f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
35600 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
35610 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
35620 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
35630 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
35640 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35650 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
35660 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35670 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  r;.    }..    pP
35680 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
35690 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  er;..    assert(
356a0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
356b0 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29  >fd) || !MEMDB )
356c0 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
356d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
356e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
356f0 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
35700 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
35710 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
35720 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
35730 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
35740 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
35750 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35770 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
35780 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
35790 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
357a0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
357b0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
357c0 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
357d0 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
357e0 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
357f0 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
35800 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
35810 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
35820 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
35830 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
35840 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
35850 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
35860 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
35870 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
35880 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
35890 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
358a0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
358b0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
358c0 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
358d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
358e0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
358f0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
35900 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
35910 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
35920 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
35930 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
35940 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
35950 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
35960 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
35970 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
35990 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
359a0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
359b0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
359c0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
359d0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
359e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
359f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35a00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35a10 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
35a20 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
35a30 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
35a40 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
35a50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
35a60 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
35a70 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
35a80 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
35a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
35aa0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
35ab0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
35ac0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
35ad0 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b  AGER_STAT_MISS]+
35ae0 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  +;.      rc = re
35af0 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
35b00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
35b10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35b20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
35b30 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
35b40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
35b50 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
35b60 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
35b70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
35b80 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
35b90 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
35ba0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
35bb0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
35bc0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
35bd0 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
35be0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
35bf0 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67  Pager);.  *ppPag
35c00 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
35c10 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
35c20 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
35c30 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65  0./* The page ge
35c40 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65  tter for when me
35c50 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20  mory-mapped I/O 
35c60 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74  is enabled */.st
35c70 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
35c80 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70  MMap(.  Pager *p
35c90 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
35ca0 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
35cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35cc0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
35cd0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
35ce0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
35cf0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
35d00 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
35d10 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
35d20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
35d30 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
35d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
35d50 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
35d60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
35d70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
35d80 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
35d90 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
35da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35db0 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
35dc0 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
35dd0 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  */..  /* It is a
35de0 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
35df0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
35e00 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
35e10 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
35e20 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
35e30 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
35e40 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
35e50 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
35e60 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
35e70 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
35e80 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
35e90 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
35ea0 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
35eb0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
35ec0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
35ed0 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
35ee0 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
35ef0 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61  gno>1.   && (pPa
35f00 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35f10 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
35f20 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
35f30 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a  READONLY)).  );.
35f40 0a 20 20 61 73 73 65 72 74 28 20 55 53 45 46 45  .  assert( USEFE
35f50 54 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23  TCH(pPager) );.#
35f60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
35f70 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28  _CODEC.  assert(
35f80 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
35f90 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
35fa0 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  /* Optimization 
35fb0 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68  note:  Adding th
35fc0 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d  e "pgno<=1" term
35fd0 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30   before "pgno==0
35fe0 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  " here.  ** allo
35ff0 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ws the compiler 
36000 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75  optimizer to reu
36010 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  se the results o
36020 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20  f the "pgno>1". 
36030 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20   ** test in the 
36040 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65  previous stateme
36050 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65  nt, and avoid te
36060 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e  sting pgno==0 in
36070 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e   the.  ** common
36080 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f   case where pgno
36090 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20   is large. */.  
360a0 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70  if( pgno<=1 && p
360b0 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
360c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
360d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
360e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
360f0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
36100 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
36110 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
36120 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
36130 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36140 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
36150 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
36160 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
36170 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
36180 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  ;..  if( bMmapOk
36190 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
361a0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
361b0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
361c0 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
361d0 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
361e0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
361f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36200 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
36210 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
36220 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
36230 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46  f( bMmapOk && iF
36240 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76  rame==0 ){.    v
36250 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
36260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36270 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
36280 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36  fd, .        (i6
36290 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
362a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
362b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
362c0 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20   &pData.    );. 
362d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
362e0 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
362f0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
36300 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
36310 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72  READER || pPager
36320 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
36330 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
36340 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
36350 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
36360 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36370 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
36380 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
36390 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
363a0 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
363b0 26 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  &pPg);.      }el
363c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
363d0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
363e0 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
363f0 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
36400 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
36410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36420 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
36430 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
36440 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
36450 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
36460 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
36470 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
36480 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
36490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
364a0 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
364b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
364c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
364d0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61 67  .  return getPag
364e0 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20  eNormal(pPager, 
364f0 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
36500 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ags);.}.#endif /
36510 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
36520 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20  P_SIZE>0 */../* 
36530 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20  The page getter 
36540 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20  method for when 
36550 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6e 20  the pager is an 
36560 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73  error state */.s
36570 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
36580 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20  eError(.  Pager 
36590 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
365a0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
365b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
365c0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
365d0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
365e0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
365f0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
36600 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
36610 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
36620 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
36630 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
36640 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
36650 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
36660 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  gs */.){.  UNUSE
36670 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f  D_PARAMETER(pgno
36680 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
36690 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20  METER(flags);.  
366a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
366b0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
366c0 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  OK );.  *ppPage 
366d0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 0;.  return pP
366e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  ager->errCode;.}
366f0 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61  .../* Dispatch a
36700 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20 72 65  ll page fetch re
36710 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 61 70  quests to the ap
36720 70 72 6f 70 72 69 61 74 65 20 67 65 74 74 65 72  propriate getter
36730 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20   method..*/.int 
36740 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36750 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
36760 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
36770 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
36780 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
36790 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
367a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
367b0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
367c0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
367d0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
367e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
367f0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
36800 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
36810 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
36820 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
36830 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
36840 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20  r->xGet(pPager, 
36850 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
36860 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ags);.}../*.** A
36870 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
36880 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
36890 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
368a0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
368b0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
368c0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
368d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
368e0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
368f0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
36900 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
36910 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
36920 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
36930 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
36940 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
36950 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
36960 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
36970 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
36980 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
36990 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
369a0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
369b0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
369c0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
369d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
369e0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
369f0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
36a00 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
36a10 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
36a20 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
36a30 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
36a40 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
36a50 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
36a60 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
36a70 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
36a80 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  e_page *pPage;. 
36a90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
36aa0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
36ab0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
36ac0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
36ad0 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61  ache!=0 );.  pPa
36ae0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
36af0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
36b00 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
36b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36b20 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ge==0 || pPager-
36b30 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
36b40 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ck );.  if( pPag
36b50 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
36b60 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
36b70 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
36b80 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
36b90 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29  he, pgno, pPage)
36ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
36bb0 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
36bc0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nce..**.** The s
36bd0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36be0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  () and sqlite3Pa
36bf0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
36c00 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) may only be.**
36c10 20 75 73 65 64 20 69 66 20 77 65 20 6b 6e 6f 77   used if we know
36c20 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 62   that the page b
36c30 65 69 6e 67 20 72 65 6c 65 61 73 65 64 20 69 73  eing released is
36c40 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 70 61   not the last pa
36c50 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65 65  ge..** The btree
36c60 20 6c 61 79 65 72 20 61 6c 77 61 79 73 20 68 6f   layer always ho
36c70 6c 64 73 20 70 61 67 65 31 20 6f 70 65 6e 20 75  lds page1 open u
36c80 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f  ntil the end, so
36c90 20 74 68 65 73 65 20 66 69 72 73 74 0a 2a 2a 20   these first.** 
36ca0 74 6f 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20  to routines can 
36cb0 62 65 20 75 73 65 64 20 74 6f 20 72 65 6c 65 61  be used to relea
36cc0 73 65 20 61 6e 79 20 70 61 67 65 20 6f 74 68 65  se any page othe
36cd0 72 20 74 68 61 6e 20 42 74 53 68 61 72 65 64 2e  r than BtShared.
36ce0 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73  pPage1..**.** Us
36cf0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
36d00 72 65 66 50 61 67 65 4f 6e 65 28 29 20 74 6f 20  refPageOne() to 
36d10 72 65 6c 65 61 73 65 20 70 61 67 65 31 2e 20 20  release page1.  
36d20 54 68 69 73 20 6c 61 74 74 65 72 20 72 6f 75 74  This latter rout
36d30 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68  ine.** checks th
36d40 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
36d50 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  f outstanding pa
36d60 67 65 73 20 61 6e 64 20 69 66 20 74 68 65 20 6e  ges and if the n
36d70 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
36d80 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 69  s reaches zero i
36d90 74 20 64 72 6f 70 73 20 74 68 65 20 64 61 74 61  t drops the data
36da0 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f  base lock..*/.vo
36db0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
36dc0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61  nrefNotNull(DbPa
36dd0 67 65 20 2a 70 50 67 29 7b 0a 20 20 54 45 53 54  ge *pPg){.  TEST
36de0 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a 70 50 61  ONLY( Pager *pPa
36df0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
36e00 72 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20 70  r; ).  assert( p
36e10 50 67 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  Pg!=0 );.  if( p
36e20 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
36e30 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61 73  R_MMAP ){.    as
36e40 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
36e50 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67 65 31 20  =1 );  /* Page1 
36e60 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
36e70 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61  mapped */.    pa
36e80 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
36e90 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
36ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
36eb0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
36ec0 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20    }.  /* Do not 
36ed0 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
36ee0 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
36ef0 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  last reference t
36f00 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20 61 73 73  o page1 */.  ass
36f10 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
36f20 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
36f30 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
36f40 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
36f50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
36f60 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
36f70 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  g ) sqlite3Pager
36f80 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
36f90 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
36fa0 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f  3PagerUnrefPageO
36fb0 6e 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ne(DbPage *pPg){
36fc0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
36fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
36fe0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
36ff0 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  pPg->pgno==1 );.
37000 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
37010 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
37020 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67  AP)==0 ); /* Pag
37030 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f  e1 is never memo
37040 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70  ry mapped */.  p
37050 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
37060 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ger;.  sqlite3Pa
37070 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65  gerResetLockTime
37080 6f 75 74 28 70 50 61 67 65 72 29 3b 0a 20 20 73  out(pPager);.  s
37090 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
370a0 61 73 65 28 70 50 67 29 3b 0a 20 20 70 61 67 65  ase(pPg);.  page
370b0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
370c0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
370d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
370e0 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
370f0 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
37100 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
37110 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
37120 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
37130 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
37140 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
37150 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
37160 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
37170 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
37180 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
37190 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
371a0 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
371b0 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
371c0 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
371d0 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
371e0 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
371f0 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
37200 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
37210 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
37220 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37230 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
37240 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37250 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
37260 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
37270 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
37280 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
37290 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
372a0 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
372b0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
372c0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
372d0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
372e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
372f0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
37300 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
37310 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
37320 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
37330 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
37340 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
37350 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
37360 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
37370 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
37380 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
37390 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
373a0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
373b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
373c0 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
373d0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
373e0 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
373f0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
37400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
37410 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
37420 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
37430 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
37440 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
37450 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
37460 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
37470 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
37480 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
37490 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
374a0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
374b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
374c0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
374d0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
374e0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
374f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37500 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
37510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37520 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37530 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
37540 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
37550 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
37560 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
37570 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
37580 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
37590 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
375a0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
375b0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
375c0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
375d0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
375e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
375f0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
37600 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
37610 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
37620 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
37630 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
37640 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
37650 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
37660 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
37670 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
37680 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
37690 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
376a0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
376b0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
376c0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
376d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
376e0 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
376f0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
37700 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
37710 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37720 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
37730 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37740 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
37750 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
37760 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
37770 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
37780 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
37790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
377a0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
377b0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
377c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
377d0 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
377e0 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
377f0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
37800 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
37810 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
37820 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
37830 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37840 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
37850 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
37860 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
37870 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
37880 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
37890 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
378a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
378b0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
378c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  ;.        int nS
378d0 70 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69  pill;..        i
378e0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
378f0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ile ){.         
37900 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
37910 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
37920 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
37930 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _TEMP_JOURNAL);.
37940 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
37950 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67   = sqlite3Config
37960 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20  .nStmtSpill;.   
37970 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37980 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
37990 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
379a0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
379b0 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c     nSpill = jrnl
379c0 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
379d0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
379e0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
379f0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
37a00 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
37a10 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
37a20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
37a30 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
37a40 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
37a50 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
37a60 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
37a70 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
37a80 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
37a90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37aa0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
37ab0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
37ac0 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20 20  en (.           
37ad0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
37ae0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
37af0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  r->jfd, flags, n
37b00 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  Spill.          
37b10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37b20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
37b30 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
37b40 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
37b50 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d  r->jfd) );.    }
37b60 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72  .  .  .    /* Wr
37b70 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
37b80 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
37b90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37ba0 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a   and open .    *
37bb0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
37bc0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
37bd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
37be0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37bf0 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43        /* TODO: C
37c00 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
37c10 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
37c20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
37c30 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
37c40 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
37c50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
37c60 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
37c70 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
37c80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
37c90 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
37ca0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
37cb0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
37cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
37cd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37ce0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
37cf0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
37d00 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
37d10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
37d20 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
37d30 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
37d40 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37d50 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37d60 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50  LOCKED );.    pP
37d70 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
37d80 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
37d90 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  EMOD;.  }..  ret
37da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37db0 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
37dc0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
37dd0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
37de0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
37df0 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
37e00 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
37e10 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
37e20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
37e30 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
37e40 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
37e50 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
37e60 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
37e70 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
37e80 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
37e90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
37ea0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
37eb0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
37ec0 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
37ed0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
37ee0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
37ef0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
37f00 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
37f10 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
37f20 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
37f30 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
37f40 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
37f50 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
37f60 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
37f70 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
37f80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
37f90 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
37fa0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
37fb0 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
37fc0 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
37fd0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
37fe0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
37ff0 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
38000 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
38010 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
38020 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
38030 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
38040 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
38050 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
38060 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
38070 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
38080 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
38090 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
380a0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
380b0 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
380c0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
380d0 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
380e0 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
380f0 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
38100 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
38110 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
38120 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
38130 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
38140 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
38150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
38160 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
38170 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
38180 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
38190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
381a0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
381b0 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
381c0 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
381d0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67  _ERROR );.  pPag
381e0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
381f0 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
38200 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  ory;..  if( ALWA
38210 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  YS(pPager->eStat
38220 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29  e==PAGER_READER)
38230 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
38240 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
38250 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66  al==0 );..    if
38260 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
38270 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  ager) ){.      /
38280 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
38290 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
382a0 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  use locking_mode
382b0 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20  =exclusive, and 
382c0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  an.      ** excl
382d0 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
382e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
382f0 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  t already held, 
38300 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20  obtain it now.. 
38310 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
38320 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
38330 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74  iveMode && sqlit
38340 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
38350 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
38360 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20   -1) ){.        
38370 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
38380 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
38390 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
383a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
383b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
383c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
383d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 28 76      }.        (v
383e0 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c 45 78  oid)sqlite3WalEx
383f0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
38400 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20  er->pWal, 1);.  
38410 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
38420 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c  Grab the write l
38430 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66  ock on the log f
38440 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
38450 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20  ul, upgrade to. 
38460 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45       ** PAGER_RE
38470 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74  SERVED state. Ot
38480 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
38490 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
384a0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
384b0 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
384c0 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
384d0 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
384e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
384f0 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
38500 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
38510 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
38520 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
38530 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
38540 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
38550 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
38560 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
38570 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
38580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
38590 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45    /* Obtain a RE
385a0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
385b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
385c0 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  . If the exFlag 
385d0 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20  parameter.      
385e0 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
385f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
38600 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
38610 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
38620 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73  The.      ** bus
38630 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
38640 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ck can be used w
38650 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f  hen upgrading to
38660 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20   the EXCLUSIVE. 
38670 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75       ** lock, bu
38680 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69  t not when obtai
38690 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45  ning the RESERVE
386a0 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  D lock..      */
386b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
386c0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
386d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2