/ Hex Artifact Content
Login

Artifact 69e5a3f5f5fe2c82be4e17fe6344c8cfdb314b64:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7140: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7150: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7160: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7170: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7180: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7190: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
71a0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71b0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71c0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71d0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71e0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
7200: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7210: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7220: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7240: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7250: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7260: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7270: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7280: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7290: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
72a0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72b0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72d0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72f0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
7300: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7320: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7330: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7340: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7350: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7360: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7370: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7380: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7390: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
73a0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73b0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73c0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73d0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73e0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
7400: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7410: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7420: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7430: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7440: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7450: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7460: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7470: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7490: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
74a0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74f0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7550: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7560: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7570: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7580: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7590: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
75a0: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75b0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75c0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75d0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75e0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75f0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7600: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7610: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7620: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7630: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7640: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7650: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7660: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7680: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7690: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
76a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76b0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76c0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76d0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76e0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76f0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7700: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7710: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7720: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7750: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7760: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7770: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
77a0: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77e0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77f0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7800: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7810: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7820: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7830: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7840: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7850: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7860: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7880: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7890: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
78a0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78b0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78c0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78d0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78e0: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
78f0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
7900: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7910: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
7920: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
7930: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
7940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
7950: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
7960: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7970: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
7980: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
7990: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
79a0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
79c0: 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65   Pgno dbHintSize
79d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
79e0: 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  Value passed to 
79f0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
7a00: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72  call */.  int er
7a10: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
7a20: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7a30: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
7a40: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
7a50: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
7a70: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
7a80: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
7a90: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
7aa0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
7ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
7ac0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
7ad0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
7ae0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
7af0: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
7b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7b10: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
7b20: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
7b30: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
7b40: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
7b50: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
7b60: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
7b70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7b80: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
7b90: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
7ba0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7bb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
7bc0: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
7bd0: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
7be0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7bf0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
7c00: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
7c10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
7c20: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
7c30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7c40: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
7c50: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
7c60: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
7c70: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
7c80: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
7c90: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7ca0: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7cc0: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
7cd0: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
7ce0: 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  eader */.  sqlit
7cf0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
7d00: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
7d10: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
7d20: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
7d30: 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  esses */.  Pager
7d40: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
7d50: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
7d60: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
7d70: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
7d80: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
7d90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7da0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
7db0: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
7dc0: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
7dd0: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
7de0: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
7df0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
7e00: 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 75 38 20  hanges */..  u8 
7e10: 62 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20  bUseFetch;      
7e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7e30: 20 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29   to use xFetch()
7e40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f   */.  int nMmapO
7e50: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
7e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
7e70: 6d 61 70 20 70 61 67 65 73 20 63 75 72 72 65 6e  map pages curren
7e80: 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  tly outstanding 
7e90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
7ea0: 36 34 20 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20  64 szMmap;      
7eb0: 20 2f 2a 20 44 65 73 69 72 65 64 20 6d 61 78 69   /* Desired maxi
7ec0: 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f  mum mmap size */
7ed0: 0a 20 20 50 67 48 64 72 20 2a 70 4d 6d 61 70 46  .  PgHdr *pMmapF
7ee0: 72 65 65 6c 69 73 74 3b 20 20 20 20 20 20 20 2f  reelist;       /
7ef0: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 6d  * List of free m
7f00: 6d 61 70 20 70 61 67 65 20 68 65 61 64 65 72 73  map page headers
7f10: 20 28 70 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f   (pDirty) */.  /
7f20: 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68  *.  ** End of th
7f30: 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e  e routinely-chan
7f40: 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65  ging class membe
7f50: 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rs.  ***********
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fa0: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
7fd0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
7fe0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
7ff0: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
8000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8010: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
8020: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
8030: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
8040: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8060: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
8070: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
8080: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
8090: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
80a0: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
80b0: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
80c0: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
80d0: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
80f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
8100: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
8110: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
8120: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
8130: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
8140: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
8150: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
8160: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
8170: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
8180: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
8190: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
81a0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
81c0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
81d0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
81e0: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
81f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8200: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
8210: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
8220: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
8230: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
8240: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
8250: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
8260: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
8270: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
8280: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
8290: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
82a0: 69 6e 74 20 61 53 74 61 74 5b 33 5d 3b 20 20 20  int aStat[3];   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
82c0: 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 2c  otal cache hits,
82d0: 20 6d 69 73 73 65 73 20 61 6e 64 20 77 72 69 74   misses and writ
82e0: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
82f0: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
8300: 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  Read;           
8310: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8320: 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a 2f  se pages read */
8330: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8340: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8350: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8360: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8370: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8380: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8390: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
83a0: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
83b0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
83c0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
83d0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
83e0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
83f0: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
8400: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8410: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8420: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8430: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8440: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8460: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8470: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8480: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8490: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
84a0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
84b0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
84c0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
84d0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
84e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
84f0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8500: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8510: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8520: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8530: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8540: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8550: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
8560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8570: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8590: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
85a0: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
85b0: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
85c0: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85e0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
85f0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
8600: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8610: 2a 20 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73  * Indexes for us
8620: 65 20 77 69 74 68 20 50 61 67 65 72 2e 61 53 74  e with Pager.aSt
8630: 61 74 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e  at[]. The Pager.
8640: 61 53 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f  aStat[] array co
8650: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
8660: 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79  lues accessed by
8670: 20 70 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f   passing SQLITE_
8680: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48  DBSTATUS_CACHE_H
8690: 49 54 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a  IT, CACHE_MISS .
86a0: 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54  ** or CACHE_WRIT
86b0: 45 20 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f  E to sqlite3_db_
86c0: 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65  status()..*/.#de
86d0: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
86e0: 48 49 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20  HIT   0.#define 
86f0: 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20  PAGER_STAT_MISS 
8700: 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   1.#define PAGER
8710: 5f 53 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f  _STAT_WRITE 2../
8720: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
8730: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
8740: 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72  les hold counter
8750: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
8760: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f  sting purposes o
8770: 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69  nly.  These vari
8780: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69  ables do not exi
8790: 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74  st in.** a non-t
87a0: 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54  esting build.  T
87b0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61  hese variables a
87c0: 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61  re not thread-sa
87d0: 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  fe..*/.#ifdef SQ
87e0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
87f0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
8800: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8810: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
8820: 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72  ll pages read fr
8830: 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  om DB */.int sql
8840: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
8850: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8860: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
8870: 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  l pages written 
8880: 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  to DB */.int sql
8890: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
88a0: 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  j_count = 0;    
88b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
88c0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  es written to jo
88d0: 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e  urnal */.# defin
88e0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20  e PAGER_INCR(v) 
88f0: 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   v++.#else.# def
8900: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
8910: 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a  ).#endif..../*.*
8920: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
8930: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
8940: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
8950: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
8960: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
8970: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
8980: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
8990: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
89a0: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
89b0: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
89c0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
89d0: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
89e0: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
89f0: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
8a00: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
8a10: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
8a20: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
8a30: 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74  s being.** writt
8a40: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
8a50: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
8a60: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
8a70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8a80: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
8a90: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
8aa0: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
8ab0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
8ac0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
8ad0: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
8ae0: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
8af0: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
8b00: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
8b10: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
8b20: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
8b30: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
8b40: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
8b50: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
8b60: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
8b70: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
8b80: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
8b90: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
8ba0: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
8bb0: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
8bc0: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
8bd0: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
8be0: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
8bf0: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
8c00: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
8c10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8c20: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
8c30: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
8c40: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
8c50: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
8c60: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
8c70: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
8c80: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8c90: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
8ca0: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
8cb0: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
8cc0: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
8cd0: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
8ce0: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
8cf0: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
8d00: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
8d10: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
8d20: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
8d30: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
8d40: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
8d50: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
8d60: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
8d70: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
8d80: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
8d90: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
8da0: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
8db0: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
8dc0: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
8dd0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
8de0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
8df0: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
8e00: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
8e10: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
8e20: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
8e30: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
8e40: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
8e50: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
8e60: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
8e70: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
8e80: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
8e90: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
8ea0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65  size of the of e
8eb0: 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20  ach page record 
8ec0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
8ed0: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68  s given by.** th
8ee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
8ef0: 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  o..*/.#define JO
8f00: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
8f10: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
8f20: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
8f30: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8f40: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
8f50: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69   this pager. Thi
8f60: 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65  s is usually the
8f70: 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61   same .** size a
8f80: 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  s a single disk 
8f90: 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f  sector. See also
8fa0: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29   setSectorSize()
8fb0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
8fc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
8fd0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
8fe0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
8ff0: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
9000: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9010: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
9020: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9030: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
9040: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
9050: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
9060: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9070: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
9080: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
9090: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
90a0: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
90b0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
90c0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
90d0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
90e0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
90f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
9100: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
9110: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
9120: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
9130: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
9140: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
9150: 54 68 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54  The macro USEFET
9160: 43 48 20 69 73 20 74 72 75 65 20 69 66 20 77 65  CH is true if we
9170: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
9180: 75 73 65 20 74 68 65 20 78 46 65 74 63 68 20 61  use the xFetch a
9190: 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69  nd xUnfetch.** i
91a0: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 61 63 63  nterfaces to acc
91b0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
91c0: 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61   using memory-ma
91d0: 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66  pped I/O..*/.#if
91e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
91f0: 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65  _SIZE>0.# define
9200: 20 55 53 45 46 45 54 43 48 28 78 29 20 28 28 78   USEFETCH(x) ((x
9210: 29 2d 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65  )->bUseFetch).#e
9220: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45  lse.# define USE
9230: 46 45 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69  FETCH(x) 0.#endi
9240: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
9250: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
9260: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
9270: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
9280: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
9290: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
92a0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
92b0: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
92c0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
92d0: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
92e0: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
92f0: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
9300: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
9310: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
9320: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9330: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
9340: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
9350: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
9360: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
9370: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
9380: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
9390: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
93a0: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
93b0: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
93c0: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
93d0: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
93e0: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52  ethods)../*.** R
93f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9400: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9410: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9420: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9430: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9440: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9450: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9460: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9470: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9480: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
9490: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
94a0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
94b0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
94c0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
94d0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
94e0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
94f0: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9500: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9510: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9520: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9530: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9540: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9550: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9560: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9570: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9580: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
9590: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
95a0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
95b0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
95c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
95d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
95e0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
95f0: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9600: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9610: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9620: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9630: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9650: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9660: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9670: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9680: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
9690: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
96a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
96b0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
96c0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
96d0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
96e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
96f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9700: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9710: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9720: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9730: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9740: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9750: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9760: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9770: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9780: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9790: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97a0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
97b0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
97c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
97d0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
97e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
97f0: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9800: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9810: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9820: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9830: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9840: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9850: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9860: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9870: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9880: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9890: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
98a0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
98b0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
98c0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
98d0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
98e0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
98f0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9900: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9910: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9920: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9930: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9940: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9950: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9960: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9970: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9980: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9990: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
99a0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
99b0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
99c0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
99d0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
99e0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
99f0: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9a00: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9a10: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9a20: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9a30: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9a40: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9a50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9a60: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9a70: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9a80: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9a90: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9aa0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9ab0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9ac0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9ad0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9ae0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9af0: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9b00: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9b10: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9b20: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9b30: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9b40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9b50: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9b60: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9b70: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9b80: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9b90: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9ba0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9bb0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9bc0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9bd0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9be0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9bf0: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9c00: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9c10: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9c30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9c40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9c50: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9c60: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9c70: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c80: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9ca0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9cb0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9cc0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9ce0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
9cf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
9d00: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
9d10: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
9d20: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
9d30: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
9d40: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
9d50: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9d60: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9d70: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
9d80: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
9d90: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
9da0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9db0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
9dc0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
9dd0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
9de0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
9df0: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
9e00: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
9e10: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9e20: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9e30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9e40: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
9e50: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
9e60: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
9e70: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
9e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9e90: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
9ea0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
9eb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9ec0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9ed0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ee0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9ef0: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9f00: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9f10: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
9f20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9f30: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9f40: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
9f50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9f60: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
9f70: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
9f80: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
9f90: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
9fa0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
9fb0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9fc0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9fd0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
9fe0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
9ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a000: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a010: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a020: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
a030: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a040: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a050: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a060: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a070: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a080: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a090: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a0a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0b0: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a0d0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a0e0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a0f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a100: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a110: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a120: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a130: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a140: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a150: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a160: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a170: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a180: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a190: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a1a0: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a1b0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a1c0: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a1d0: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a1e0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a1f0: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a200: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a210: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a220: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a230: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a240: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a250: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a260: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a270: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a280: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a290: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a2a0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a2c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a2d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a2e0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a2f0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a300: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a310: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a320: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a330: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a340: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a350: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a360: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a370: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a380: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a390: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a3a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a3b0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a3c0: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a3d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a3e0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a3f0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a400: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a410: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a420: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a430: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a440: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a450: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a460: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a470: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a480: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a490: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a4a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a4b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a4c0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a4d0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a4e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a4f0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a500: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a510: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a520: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a530: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a540: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a550: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a560: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a570: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a580: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a590: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a5a0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a5b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a5d0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a5e0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a5f0: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a600: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a610: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a620: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a630: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a640: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a650: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a660: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a670: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a680: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a690: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a6a0: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a6b0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a6c0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a6d0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a6e0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
a6f0: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
a700: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
a710: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
a720: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
a730: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
a740: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
a750: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a760: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a770: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
a780: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a790: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
a7a0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
a7b0: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
a7c0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
a7d0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
a7e0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
a7f0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a800: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
a810: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
a820: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
a830: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
a840: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
a850: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
a860: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
a870: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
a880: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
a890: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
a8a0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
a8b0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
a8c0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
a8d0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
a8e0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
a8f0: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
a900: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
a910: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
a920: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
a930: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
a940: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
a950: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
a960: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
a970: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
a980: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
a990: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
a9a0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
a9b0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
a9c0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
a9d0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
a9e0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
a9f0: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
aa00: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
aa10: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
aa20: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
aa30: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
aa40: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
aa50: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
aa60: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
aa70: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
aa80: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
aa90: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
aaa0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
aab0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
aac0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
aad0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
aae0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
aaf0: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ab00: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ab10: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ab20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ab30: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ab40: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ab50: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ab60: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ab70: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
ab80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ab90: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aba0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
abb0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
abc0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
abd0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
abe0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
abf0: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
ac00: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
ac10: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
ac20: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
ac30: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
ac40: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ac50: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
ac60: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
ac70: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ac80: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
ac90: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
aca0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
acb0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
acc0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
acd0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
ace0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
acf0: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
ad00: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
ad10: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
ad20: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
ad30: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
ad40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
ad50: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
ad60: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
ad70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
ad80: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
ad90: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
ada0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
adb0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
adc0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
add0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
ade0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
adf0: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
ae00: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
ae10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ae20: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
ae30: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
ae40: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
ae50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ae60: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
ae70: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
ae80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ae90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aea0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
aeb0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
aec0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aed0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aee0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
aef0: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
af00: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
af10: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
af20: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
af30: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
af40: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
af50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
af60: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
af70: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
af80: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
af90: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
afa0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
afb0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
afc0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
afd0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
afe0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
aff0: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b000: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b010: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b020: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b030: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b040: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b050: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b060: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b070: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b080: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b090: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b0a0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b0b0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b0c0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b0d0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b0e0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b0f0: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b100: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b110: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b120: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b130: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b140: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b150: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b160: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b170: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b180: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b190: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b1a0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b1b0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b1c0: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b1d0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b1e0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b1f0: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b200: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b210: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b220: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b230: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b240: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b250: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b260: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b270: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b280: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b290: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b2a0: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
b2b0: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b2c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b2d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b2e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b2f0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
b300: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
b310: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b320: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b330: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
b340: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
b350: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
b360: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
b370: 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
b380: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
b390: 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  gno);.}../*.** R
b3a0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b3b0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b3c0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b3d0: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b3e0: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b3f0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b400: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b410: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b420: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b430: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b440: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b450: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b460: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b470: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b480: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b490: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b4a0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b4b0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b4c0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b4d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b4e0: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b4f0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b500: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b510: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b530: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b540: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b560: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b570: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b580: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b590: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b5a0: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b5b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b5c0: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b5d0: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b5e0: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b5f0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b600: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b610: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b620: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b630: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b640: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b650: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b660: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b680: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b690: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b6a0: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b6b0: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b6c0: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b6d0: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b6e0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b6f0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b710: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b720: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b730: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b740: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b750: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b760: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b770: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b780: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b790: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b7a0: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b7b0: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b7c0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b7d0: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b7e0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b7f0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b800: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b810: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b820: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b830: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b840: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b850: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b860: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b870: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b880: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b890: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b8a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b8b0: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b8c0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b8d0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b8e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b8f0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b900: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b910: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b920: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b930: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b940: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b950: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b960: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b970: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b980: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b990: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b9a0: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b9b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b9c0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b9d0: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
b9e0: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
b9f0: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
ba00: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
ba10: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
ba20: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
ba30: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
ba40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
ba50: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
ba60: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
ba70: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
ba80: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
ba90: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
baa0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bab0: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bac0: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bad0: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bae0: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
baf0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bb00: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bb10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bb20: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bb30: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bb40: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bb50: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bb60: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bb70: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bb80: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bb90: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bba0: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bbb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bbc0: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bbd0: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bbe0: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bbf0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bc00: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bc10: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bc20: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bc30: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bc40: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bc50: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bc60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bc70: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bc80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bc90: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bca0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bcb0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
bcc0: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
bcd0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bce0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
bcf0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
bd00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bd10: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
bd20: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
bd30: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bd40: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
bd50: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
bd60: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bd70: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bd80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bd90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bda0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bdb0: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bdc0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bdd0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bde0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bdf0: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
be00: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
be10: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
be20: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
be30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
be40: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
be50: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
be60: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
be70: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
be80: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
be90: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bea0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
beb0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bec0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bed0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bee0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bef0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bf00: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bf10: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bf20: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bf30: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bf40: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bf50: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bf60: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bf70: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bf80: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bf90: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bfa0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bfb0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bfc0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bfd0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bfe0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
bff0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c000: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c010: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c020: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c030: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c040: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c050: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c060: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c070: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c080: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c090: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c0a0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c0b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c0c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c0d0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c0e0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c0f0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c100: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c110: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c120: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c130: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c140: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c150: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c160: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c170: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c180: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c1b0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c1c0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c1d0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c1f0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c200: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c230: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c240: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c250: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c260: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c270: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c280: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c290: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c2a0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c2b0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c2c0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c2d0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c2e0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c2f0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c300: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c310: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c320: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c330: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c340: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c350: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c360: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c370: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c390: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c3a0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c3b0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c3c0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c3d0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c3e0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c3f0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c400: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c410: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c420: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c430: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c440: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c450: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c460: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c470: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c480: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c490: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c4a0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c4b0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c4c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c4d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c4e0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c4f0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c500: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c510: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c520: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c530: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c540: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c550: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c560: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c570: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c580: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c590: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c5a0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c5b0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c5c0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c5d0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c5e0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c5f0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c600: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c610: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c620: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c630: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c650: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c660: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c670: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c680: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c690: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c6a0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c6b0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c6c0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c6d0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c6e0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c6f0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c700: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c710: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c720: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c730: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c740: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c750: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c760: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c770: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c780: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c790: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c7a0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c7b0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c7c0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c7d0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c7e0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c7f0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c800: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c810: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c820: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c830: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c840: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c850: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c860: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c870: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c880: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c890: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c8a0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c8b0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c8c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c8d0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c8e0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c8f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c900: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c910: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c920: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c930: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c940: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c950: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c960: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c970: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c980: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c990: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c9a0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c9b0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c9c0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c9d0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c9e0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c9f0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
ca00: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
ca10: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
ca20: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
ca30: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
ca40: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
ca50: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
ca60: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
ca70: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
ca80: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
ca90: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
caa0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cab0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cad0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cae0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
caf0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cb00: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cb10: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cb20: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cb30: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cb40: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cb50: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cb60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cb70: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cb80: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
cb90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cba0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cbb0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cbc0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cbd0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cbe0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cbf0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
cc00: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
cc10: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
cc20: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cc30: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
cc40: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cc50: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cc60: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cc70: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cc80: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cc90: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ccb0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
ccc0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
ccd0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
cce0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
ccf0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cd00: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cd10: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cd20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cd30: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cd40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cd50: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cd60: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cd70: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cd80: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cd90: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cda0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cdb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cdc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cdd0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cde0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cdf0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ce00: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
ce10: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ce20: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce40: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
ce50: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
ce60: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
ce70: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
ce90: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cea0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
ceb0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cee0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cef0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cf00: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cf10: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cf20: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cf30: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cf40: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cf50: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cf60: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cf70: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cf80: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cf90: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cfa0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cfb0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cfc0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cfd0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cfe0: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
cff0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d000: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d010: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d020: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d030: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d040: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d050: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d060: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d070: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d080: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d090: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d0a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d0b0: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d0c0: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d0d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d0e0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d0f0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d100: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d110: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d120: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d130: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d140: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d150: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d160: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d170: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d180: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d190: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d1a0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d1b0: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d1c0: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d1d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d1e0: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d1f0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d200: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d210: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d230: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d240: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d250: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d260: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d270: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d280: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d290: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d2a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d2b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d2c0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d2d0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d2e0: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d2f0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d300: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d310: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d320: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d330: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d340: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d350: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d360: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d370: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d380: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d390: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d3a0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3d0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d420: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d430: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d440: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d450: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d460: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d470: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d480: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d490: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d4a0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d4b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d4c0: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d4d0: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d4e0: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d4f0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d500: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d510: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d520: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d530: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d540: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d550: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d560: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d570: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d580: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d590: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d5a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d5b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d5c0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d5d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d5e0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d5f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d600: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d610: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d620: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d630: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d640: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d650: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d660: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d670: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d680: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d690: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d6a0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d6b0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d6c0: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d6d0: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d6e0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d6f0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d700: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d710: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d720: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d730: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d740: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d750: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d760: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d770: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d780: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d790: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d7a0: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d7b0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d7c0: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d7d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d7e0: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d7f0: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d800: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d810: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d820: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d830: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d840: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d850: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d860: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d870: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d880: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d890: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d8a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d8b0: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d8c0: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d8d0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d8e0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d8f0: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d900: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d910: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d920: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d930: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d940: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
d950: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
d960: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
d970: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
d980: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
d990: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
d9a0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
d9b0: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
d9c0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
d9d0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
da00: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
da10: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
da20: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
da30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
da40: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
da50: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
da60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
da70: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
da80: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
da90: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
daa0: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
dab0: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
dac0: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
dad0: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
dae0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
daf0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
db00: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
db10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
db20: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
db30: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
db40: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
db50: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
db60: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
db70: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
db80: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
db90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dba0: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dbb0: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dbc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dbd0: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dbe0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dbf0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dc00: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dc10: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dc20: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dc30: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dc40: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dc50: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
dc60: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
dc70: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dc80: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dc90: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
dca0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
dcb0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
dcc0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
dcd0: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
dce0: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dcf0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
dd00: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
dd10: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
dd20: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dd30: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
dd40: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
dd50: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
dd60: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
dd70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dd80: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
dd90: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
dda0: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
ddb0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ddc0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
ddd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
dde0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
ddf0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
de00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
de10: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
de20: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
de30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
de40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
de50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
de60: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
de70: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
de80: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
de90: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
dea0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
deb0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
dec0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ded0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
dee0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
def0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
df00: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
df10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
df20: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
df30: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
df40: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
df50: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
df60: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
df70: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
df80: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
df90: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
dfa0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
dfb0: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
dfc0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
dfd0: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
dfe0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
dff0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e000: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e010: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e020: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e030: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e040: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e050: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e060: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e070: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e080: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e090: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e0a0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e0b0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e0c0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e0d0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e0e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e110: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e120: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e130: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e140: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e150: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e160: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e170: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e180: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e190: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e1a0: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e1b0: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e1e0: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e1f0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e200: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e230: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e240: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e250: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e260: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e270: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e280: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e290: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e2a0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e2b0: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e2c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e2d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e2e0: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e2f0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e300: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e310: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e320: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e330: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e340: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e350: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e360: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e370: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e380: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e390: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e3a0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e3b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e3c0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e3d0: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e3e0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e3f0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e400: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e410: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e420: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e430: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e440: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e450: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e460: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e470: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e480: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e490: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e4a0: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e4b0: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e4c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e4d0: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e4e0: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e4f0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e500: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e510: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e520: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e540: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e550: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e560: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e570: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e580: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e590: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e5a0: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e5b0: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e5c0: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e5d0: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e5e0: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e5f0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e600: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e610: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e620: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e630: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e640: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e650: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e660: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e670: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e680: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e690: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e6a0: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e6b0: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e6c0: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e6d0: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e6e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e6f0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e700: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e710: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e720: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e730: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e740: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e750: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e760: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e770: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e780: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e790: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e7a0: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e7b0: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e7c0: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e7d0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e7e0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e7f0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e800: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e810: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e820: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e830: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e840: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e850: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e860: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e870: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e880: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e890: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e8a0: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
e8b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
e8c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
e8d0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
e8e0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e8f0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
e900: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
e910: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e920: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
e930: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
e940: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
e950: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e960: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
e970: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e980: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e990: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
e9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
e9b0: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
e9c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e9d0: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
e9e0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
e9f0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
ea00: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
ea10: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ea20: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
ea30: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
ea40: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ea50: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ea60: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ea70: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
ea80: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ea90: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
eaa0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
eab0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
eac0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ead0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
eae0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eaf0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
eb00: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
eb10: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
eb20: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
eb30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eb40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb50: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
eb60: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
eb70: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
eb80: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
eb90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
eba0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ebb0: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ebc0: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ebd0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ebe0: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
ebf0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ec00: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ec10: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ec20: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ec30: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ec40: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ec50: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ec60: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ec70: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ec80: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ec90: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
eca0: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ecb0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ecc0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ecd0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ece0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
ecf0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
ed00: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
ed10: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
ed20: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ed30: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
ed40: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ed50: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ed60: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ed70: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ed80: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ed90: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
eda0: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
edb0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
edc0: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
edd0: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ede0: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
edf0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
ee00: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
ee10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ee20: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
ee30: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
ee40: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
ee50: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
ee60: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
ee70: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
ee80: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
ee90: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
eea0: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
eeb0: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
eec0: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
eed0: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
eee0: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
eef0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
ef00: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
ef10: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
ef20: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
ef30: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
ef40: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
ef50: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
ef60: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
ef70: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
ef80: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
ef90: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
efa0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
efb0: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
efc0: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
efd0: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
efe0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
eff0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f000: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f010: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f020: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f030: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f040: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f050: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f060: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f070: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f080: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f090: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f0a0: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f0b0: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f0c0: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f0d0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f0e0: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f0f0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f100: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f110: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f120: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f130: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f140: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f150: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f160: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f170: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f180: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f190: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f1a0: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f1b0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f1c0: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f1d0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f1e0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f1f0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f200: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f210: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f220: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f230: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f240: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f250: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f260: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f270: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f280: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f290: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f2a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f2b0: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f2c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f2d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f2e0: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f300: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f310: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f320: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f330: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f340: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f350: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f360: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f370: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f380: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f390: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f3a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f3b0: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f3c0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f3d0: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f3e0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f3f0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f400: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f410: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f420: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f430: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f440: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f450: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f460: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f470: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f480: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f490: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f4a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f4b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f4c0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f4d0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f4e0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f4f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f500: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f510: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f520: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f530: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f540: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f550: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f560: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f570: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f580: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f590: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f5a0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f5c0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f5d0: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f5e0: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f600: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f610: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f620: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f630: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f640: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f650: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f660: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f670: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f690: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f6a0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f6b0: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f6c0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f6f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f700: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f710: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f720: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f730: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f740: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f760: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f770: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f780: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f790: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f7a0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f7b0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f7c0: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f7d0: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f7e0: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f7f0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f800: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f810: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f820: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f830: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f840: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f850: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f860: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f870: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f890: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f8a0: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
f8b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
f8c0: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
f8d0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
f8e0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
f8f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f900: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
f910: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
f920: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
f930: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
f940: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
f950: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f960: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
f970: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
f980: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
f990: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
f9a0: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
f9b0: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
f9c0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
f9d0: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
f9e0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
f9f0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fa00: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fa10: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fa20: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fa30: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
fa40: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fa50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fa60: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fa70: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fa80: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fa90: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
faa0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fab0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fac0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fad0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fae0: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
faf0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fb00: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fb10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fb20: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fb30: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fb40: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fb50: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fb60: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fb70: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fb80: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fb90: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fba0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fbb0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fbc0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fbd0: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fbe0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fbf0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fc00: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fc10: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fc20: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fc30: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fc40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fc50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fc60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fc70: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fc80: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fc90: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fca0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fcb0: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fcc0: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fcd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fce0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fcf0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fd00: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fd10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fd20: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fd30: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fd40: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fd50: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fd70: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fd80: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fd90: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fda0: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
fdb0: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
fdc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fdd0: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
fde0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fdf0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fe00: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fe10: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
fe20: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
fe30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fe40: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fe50: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
fe60: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
fe70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
fe80: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
fe90: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
fea0: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
feb0: 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
fec0: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
fed0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
fee0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
fef0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
ff00: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
ff10: 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
ff20: 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
ff30: 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
ff40: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
ff50: 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
ff60: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
ff70: 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
ff80: 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
ff90: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
ffa0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
ffb0: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
ffc0: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
ffd0: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
ffe0: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
fff0: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10000 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10010 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10020 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10030 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
10040 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10050 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10060 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10070 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10080 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10090 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
100a0 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
100b0 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
100c0 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
100d0 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
100e0 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
100f0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10100 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10110 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10120 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10130 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
10140 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10150 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10160 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10170 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10180 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10190 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
101a0 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
101b0 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
101c0 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
101d0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
101e0 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
101f0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10200 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10210 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10220 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10230 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
10240 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10250 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10260 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10270 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10290 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
102a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
102b0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
102c0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
102d0 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
102e0 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
102f0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10300 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10310 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10320 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10330 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
10340 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10350 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10360 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10370 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10380 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10390 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
103a0 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
103b0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
103c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
103d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
103e0 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
103f0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10400 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10410 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10420 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10430 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
10440 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10450 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10460 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10470 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10480 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10490 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
104a0 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
104b0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
104c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
104d0 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
104e0 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
104f0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10500 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10510 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10520 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10530 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
10540 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10550 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10560 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10570 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10580 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10590 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
105a0 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
105b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
105c0 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
105d0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
105e0 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
105f0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
10600 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
10610 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
10620 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
10630 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
10640 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10650 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10660 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10670 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10680 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10690 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
106a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
106b0 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
106c0 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
106d0 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
106e0 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
106f0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
10700 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
10710 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
10720 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10730 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
10740 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10750 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10760 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10770 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10780 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10790 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
107a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
107b0 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
107c0 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
107d0 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
107e0 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
107f0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
10800 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
10810 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
10820 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
10830 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
10840 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10850 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10860 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10870 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10880 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10890 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
108a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
108b0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
108c0 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
108d0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
108e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
108f0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
10900 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10910 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10920 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10950 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10960 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10980 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10990 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
109a0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
109c0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
109d0 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
109e0 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
109f0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10a00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10a10 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10a20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10a30 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a50 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10a60 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10a70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10a80 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10a90 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10aa0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10ab0 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10ac0 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10ae0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10af0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10b00 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10b10 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10b30 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10b40 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10b50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10b60 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10b70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10b80 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10b90 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10ba0 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10bb0 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10bc0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10bd0 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10be0 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10bf0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10c00 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10c10 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10c20 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10c30 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10c40 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10c50 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10c60 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10c70 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10c80 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10c90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10ca0 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10cb0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10cc0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10cd0 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10ce0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10cf0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10d10 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10d20 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10d30 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10d40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10d50 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10d60 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10d70 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10d80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10d90 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10da0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10db0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10dc0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10dd0 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10de0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10df0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10e00 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10e10 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10e20 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10e30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10e40 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10e50 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10e60 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10e70 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10e80 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10e90 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10ea0 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10eb0 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10ec0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10ed0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10ee0 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10ef0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10f00 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10f10 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10f20 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10f30 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10f40 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10f50 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
10f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10f70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10f80 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
10f90 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
10fa0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
10fb0 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
10fc0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
10fd0 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
10fe0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
10ff0 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
11000 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
11010 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
11020 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
11030 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
11040 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
11050 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
11060 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
11070 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
11080 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
11090 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
110a0 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
110b0 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
110c0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
110d0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
110e0 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
110f0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
11100 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
11110 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
11120 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
11130 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
11140 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
11150 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
11160 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
11170 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
11180 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
11190 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
111a0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
111b0 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
111c0 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
111d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
111e0 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
111f0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11200 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
11210 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11220 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
11230 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69   rc;.}../*.** Di
11240 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
11250 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11260 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d   in-memory page-
11270 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
11280 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
11290 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
112a0 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  {.  sqlite3Backu
112b0 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
112c0 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c  >pBackup);.  sql
112d0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
112e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
112f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
11300 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
11310 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
11320 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
11330 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
11340 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
11350 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
11360 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
11370 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
11380 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
11390 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
113a0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
113b0 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
113c0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
113d0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
113e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
113f0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
11400 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
11410 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
11420 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
11430 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
11440 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11450 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11460 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
11470 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11480 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11490 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
114a0 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
114b0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
114c0 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
114d0 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
114e0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
114f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11500 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
11510 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
11520 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
11530 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
11540 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
11550 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
11560 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
11570 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
11580 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
11590 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
115a0 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
115b0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
115c0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76  vepoint .** bitv
115d0 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ecs of all open 
115e0 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75  savepoints. Retu
115f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
11600 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72  successful.** or
11610 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
11620 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
11630 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  e occurs..*/.sta
11640 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76  tic int addToSav
11650 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61  epointBitvecs(Pa
11660 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
11670 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69  o pgno){.  int i
11680 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11690 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
116a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
116b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
116c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
116d0 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d  de */..  for(ii=
116e0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
116f0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
11700 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
11710 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
11720 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11730 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  ;.    if( pgno<=
11740 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  p->nOrig ){.    
11750 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42    rc |= sqlite3B
11760 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53  itvecSet(p->pInS
11770 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b  avepoint, pgno);
11780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
117a0 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
117b0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
117c0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
117d0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  OMEM );.    }.  
117e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
117f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11800 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
11810 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
11820 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11830 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e  de and not.** in
11840 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
11850 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
11860 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67  switches the pag
11870 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  er to PAGER_OPEN
11880 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  .** state..**.**
11890 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
118a0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
118b0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74  e-access mode, t
118c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
118d0 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c   is.** completel
118e0 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74  y unlocked. If t
118f0 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
11900 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ked and the file
11910 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20  -system does.** 
11920 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20  not exhibit the 
11930 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11940 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20  _OPEN property, 
11950 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11960 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69   is.** closed (i
11970 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a  f it is open)..*
11980 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11990 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74  r is in ERROR st
119a0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
119b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
119c0 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  , the .** conten
119d0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
119e0 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72  cache are discar
119f0 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63  ded before switc
11a00 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a  hing back to .**
11a10 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
11a20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
11a30 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72  hether the pager
11a40 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11a50 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c  -mode.** or not,
11a60 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   any journal fil
11a70 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
11a80 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62  le-system will b
11a90 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20  e treated.** as 
11aa0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
11ab0 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  d rolled back th
11ac0 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65  e next time a re
11ad0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  ad-transaction.*
11ae0 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20  * is opened (by 
11af0 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f  this or by any o
11b00 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  ther connection)
11b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
11b30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
11b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11b50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
11b60 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c  EADER .       ||
11b70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11b80 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20  =PAGER_OPEN .   
11b90 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11ba0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11bb0 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69  OR .  );..  sqli
11bc0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11bd0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
11be0 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
11bf0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
11c00 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
11c10 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
11c20 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
11c30 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
11c40 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
11c50 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
11c60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
11c70 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
11c80 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
11c90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
11ca0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
11cb0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
11cc0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11cd0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
11ce0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
11d00 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
11d10 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
11d20 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
11d30 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
11d40 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
11d50 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
11d60 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
11d70 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
11d80 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
11d90 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
11da0 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
11db0 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
11dc0 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
11dd0 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
11de0 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
11df0 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
11e00 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
11e10 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
11e20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
11e30 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
11e40 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
11e50 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
11e60 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
11e70 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11e80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
11e90 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
11ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11eb0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ec0 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
11ed0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11ee0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11ef0 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
11f00 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11f10 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11f20 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
11f30 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11f40 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11f50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
11f60 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
11f70 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11f80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
11f90 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
11fa0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
11fb0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
11fc0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
11fd0 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
11fe0 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
11ff0 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
12000 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12010 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
12020 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
12030 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
12040 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
12050 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12060 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
12070 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
12080 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
12090 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
120a0 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
120b0 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
120c0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
120d0 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
120e0 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
120f0 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
12100 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
12110 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
12120 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
12130 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
12140 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
12150 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12160 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
12170 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12180 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
12190 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
121a0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
121b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
121c0 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
121d0 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
121e0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
121f0 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
12200 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
12210 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
12220 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
12230 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
12240 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
12250 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
12260 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
12270 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
12280 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
12290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
122a0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
122b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
122c0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
122d0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
122e0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
122f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12300 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
12310 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
12320 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
12330 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12340 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12350 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
12360 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
12370 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
12380 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
12390 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
123a0 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
123b0 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
123c0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
123d0 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
123e0 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
123f0 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
12400 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
12410 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
12420 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
12430 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
12440 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
12450 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
12460 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12470 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
12480 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
12490 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
124a0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
124b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
124c0 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
124d0 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
124e0 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
124f0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
12500 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
12510 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12520 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12530 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12540 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12550 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12560 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12570 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12580 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
12590 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
125a0 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
125b0 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
125c0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
125d0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
125e0 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
125f0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
12600 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
12610 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12620 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12630 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12640 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12650 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12660 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
12670 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
12680 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
12690 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
126a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126b0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
126c0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
126d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126e0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
126f0 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
12700 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
12710 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12720 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12730 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12740 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12750 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12760 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
12770 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
12780 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
12790 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
127a0 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
127b0 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
127c0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
127d0 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
127e0 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
127f0 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
12800 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
12810 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12820 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12830 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12840 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12850 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12860 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
12870 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
12880 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12890 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
128a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
128b0 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
128c0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
128d0 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
128e0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
128f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
12900 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
12910 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12920 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12930 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12940 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12950 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12960 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
12970 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
12980 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12990 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
129a0 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
129b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
129c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
129d0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
129e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
129f0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
12a00 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
12a10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12a20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12a30 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12a40 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12a50 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12a60 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12a70 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
12a80 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12a90 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12aa0 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
12ab0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12ac0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12ad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12ae0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12af0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12b00 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12b10 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  e);../*.** This 
12b20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12b30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12b40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12b50 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12b60 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12b70 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12b80 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12b90 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
12ba0 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
12bb0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
12bc0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
12bd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12be0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
12bf0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12c00 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12c10 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12c20 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12c30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12c40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12c50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c60 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12c70 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12c80 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12c90 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
12ca0 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
12cb0 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
12cc0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
12cd0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
12ce0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
12cf0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12d00 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12d10 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12d20 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12d30 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12d40 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12d50 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12d60 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12d70 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12d80 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12d90 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
12da0 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
12db0 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
12dc0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
12dd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
12de0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
12df0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12e00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12e10 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12e20 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12e30 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12e40 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12e50 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12e60 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12e70 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12e80 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12ea0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12eb0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ec0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12ed0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ee0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12ef0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12f00 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12f10 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12f20 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12f30 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12f40 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12f50 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12f60 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12f70 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12f80 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12f90 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12fa0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12fb0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12fc0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12fd0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12fe0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13000 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
13010 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13020 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13030 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13040 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13050 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13060 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13070 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13090 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
130a0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
130b0 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
130c0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
130d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
130e0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
130f0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
13100 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
13110 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13120 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13130 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13140 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13150 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13160 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13170 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13180 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13190 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
131a0 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
131b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
131c0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
131d0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
131e0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
131f0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13200 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
13210 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13220 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13230 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13240 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13250 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13260 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13270 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13280 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13290 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
132a0 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
132b0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
132c0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
132d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
132e0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
132f0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
13300 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13310 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13320 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13330 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13350 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13360 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13370 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13380 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13390 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
133a0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
133b0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
133c0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
133d0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
133e0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
133f0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
13400 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
13410 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13420 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13430 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13440 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13450 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13460 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13470 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13480 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13490 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
134a0 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
134b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
134c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
134d0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
134e0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
134f0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
13500 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
13510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13530 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13540 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13550 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13560 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13570 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13580 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13590 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
135a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
135b0 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
135c0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
135d0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
135e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
135f0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
13600 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
13610 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
13620 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13630 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13640 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13650 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13660 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13670 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13680 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13690 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
136a0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
136b0 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
136c0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
136d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
136e0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
136f0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
13700 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
13710 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13720 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13730 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13740 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13750 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13760 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13770 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13780 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13790 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
137a0 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
137b0 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
137c0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
137d0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
137e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
137f0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
13800 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
13810 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
13820 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13830 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13840 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13850 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13860 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13870 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13890 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
138a0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
138b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
138c0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
138d0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
138e0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
138f0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
13900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13910 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
13920 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13930 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13940 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13950 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13960 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13970 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13980 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13990 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
139a0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
139b0 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
139d0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
139e0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
139f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
13a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
13a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13a20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13a30 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13a40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13a50 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13a60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13a70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a80 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a90 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13aa0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13ab0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13ac0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13b00 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
13b10 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13b20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13b30 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13b40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13b50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13b60 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13b70 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13b80 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13b90 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13bb0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13bc0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13bd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13be0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13bf0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13c00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13c10 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c30 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13c40 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13c50 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13c60 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13c70 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13c80 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13c90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13ca0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13cb0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13cc0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13cd0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13ce0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13cf0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13d00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13d10 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13d20 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13d30 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13d40 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13d50 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13d60 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13d70 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13d80 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13d90 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13db0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13dc0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13dd0 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13de0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13df0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13e00 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13e10 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13e20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13e30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13e50 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13e60 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13e70 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13e80 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
13e90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13ea0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13eb0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13ec0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13ed0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13ee0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13ef0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13f00 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13f10 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13f20 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13f30 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13f40 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13f50 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13f60 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13f70 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13f80 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13f90 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Hdr *p = sqlite3
13fa0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
13fb0 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  er, 1);.    if( 
13fc0 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61  p ){.      p->pa
13fd0 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  geHash = 0;.    
13fe0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
13ff0 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20  refNotNull(p);. 
14000 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14010 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
14020 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
14030 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
14040 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
14050 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
14060 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
14070 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
14080 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
14090 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
140a0 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
140b0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
140c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
140d0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
140e0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
140f0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
14100 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
14110 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
14120 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
14130 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
14140 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
14150 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
14160 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
14170 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
14180 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
14190 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
141a0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
141b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
141c0 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
141d0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
141e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
141f0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
14200 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
14210 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
14220 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
14230 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
14240 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
14250 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14260 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
14270 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
14280 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
14290 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
142a0 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
142b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
142c0 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
142d0 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
142e0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
142f0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
14300 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
14310 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
14320 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14330 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
14340 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
14350 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
14360 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
14370 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
14380 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
14390 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
143a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
143b0 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
143c0 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
143d0 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
143e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
143f0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
14400 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
14410 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
14420 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
14430 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
14440 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14450 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14460 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
14470 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  ->fd) ){.    rc 
14480 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
14490 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
144a0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
144b0 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c  COMMIT_PHASETWO,
144c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
144d0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
144e0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
144f0 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
14500 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14510 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
14520 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14530 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
14540 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
14550 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
14560 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14570 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14580 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14590 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
145a0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
145b0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
145c0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
145d0 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
145e0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
145f0 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14600 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14610 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14620 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14630 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14640 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
14650 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
14660 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14670 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14680 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14690 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
146a0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
146b0 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
146c0 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
146d0 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
146e0 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
146f0 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14700 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14710 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14720 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14730 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14750 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
14760 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14770 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14780 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14790 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
147a0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
147b0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
147c0 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
147d0 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
147e0 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
147f0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14800 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
14810 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
14820 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
14830 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
14840 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
14850 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
14860 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
14870 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14880 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14890 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
148a0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
148b0 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
148c0 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
148d0 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
148e0 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
148f0 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14900 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14910 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
14920 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
14930 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
14940 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
14950 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
14960 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
14970 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14980 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
14990 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
149a0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
149b0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
149c0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
149d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
149e0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
149f0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14a10 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14a20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14a30 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14a40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
14a50 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14a60 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
14a70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14a80 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
14a90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14aa0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14ab0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14ac0 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14ad0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14ae0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
14af0 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
14b00 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
14b10 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
14b20 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
14b30 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
14b40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
14b50 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
14b60 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
14b70 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
14b80 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
14b90 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
14ba0 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
14bb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
14bc0 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
14bd0 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
14be0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
14bf0 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
14c00 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
14c10 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
14c20 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
14c30 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
14c40 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
14c50 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
14c60 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
14c70 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
14c80 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
14c90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
14ca0 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
14cb0 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
14cc0 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
14cd0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
14ce0 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
14cf0 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
14d00 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
14d10 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
14d20 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
14d30 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
14d40 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
14d50 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
14d60 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
14d70 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
14d80 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
14d90 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
14da0 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
14db0 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
14dc0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
14dd0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
14de0 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
14df0 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
14e00 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
14e10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
14e20 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
14e30 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
14e40 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
14e50 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
14e60 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
14e70 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
14e80 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
14e90 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
14ea0 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
14eb0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
14ec0 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
14ed0 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
14ee0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
14ef0 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
14f00 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
14f10 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
14f20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
14f30 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
14f40 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
14f50 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
14f60 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14f70 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
14f80 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
14f90 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
14fa0 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
14fb0 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
14fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
14fd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
14fe0 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
14ff0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
15000 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
15010 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
15020 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15030 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
15040 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
15050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15060 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
15070 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
15080 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
15090 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
150a0 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
150b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
150e0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
150f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
15100 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
15110 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
15120 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
15130 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
15140 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
15150 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
15160 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
15170 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
15180 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
15190 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
151a0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
151b0 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
151c0 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
151d0 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
151e0 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
151f0 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
15200 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
15210 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
15220 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
15230 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
15240 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
15250 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
15260 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
15270 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
15280 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
15290 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
152a0 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
152b0 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
152c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
152d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
152e0 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
152f0 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15300 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
15310 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
15320 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
15330 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
15340 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
15350 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
15360 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
15380 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
15390 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
153a0 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
153b0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
153c0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
153d0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
153e0 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
153f0 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
15400 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
15410 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
15420 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
15430 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
15440 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
15450 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
15460 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
15470 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
15480 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
15490 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
154a0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
154b0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
154c0 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
154d0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
154e0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
154f0 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
15500 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
15510 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15520 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
15530 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
15540 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
15550 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
15560 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
15570 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
15580 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
15590 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
155a0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
155b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
155c0 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
155d0 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
155e0 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
155f0 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
15600 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
15610 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
15620 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
15630 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
15640 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
15650 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
15660 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
15670 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15680 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
15690 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
156a0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
156b0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
156c0 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
156d0 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
156e0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
156f0 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
15700 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
15710 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
15720 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
15730 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
15740 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
15750 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
15760 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
15770 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15780 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
15790 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
157a0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
157b0 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
157c0 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
157d0 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
157e0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
157f0 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
15800 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
15810 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
15820 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
15830 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
15840 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15850 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15860 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
15870 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
15880 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
15890 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
158a0 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
158b0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
158c0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
158d0 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
158e0 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
158f0 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
15900 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
15910 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
15920 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
15930 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
15940 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
15950 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
15960 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
15970 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
15980 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159a0 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
159b0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
159c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
159d0 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
159f0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
15a00 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15a10 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
15a40 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
15a50 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
15a60 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a80 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
15a90 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
15aa0 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
15ab0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
15ac0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
15ad0 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
15ae0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
15af0 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
15b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15b10 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15b20 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
15b30 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
15b40 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
15b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15b60 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
15b70 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
15b80 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
15b90 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
15ba0 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
15bb0 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
15bc0 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
15bd0 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
15be0 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
15bf0 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
15c00 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
15c10 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
15c20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
15c30 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
15c40 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
15c50 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
15c60 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
15c70 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
15c80 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
15c90 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
15ca0 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
15cb0 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
15cc0 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
15cd0 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
15ce0 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
15cf0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
15d00 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
15d10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15d20 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
15d30 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
15d40 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
15d50 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
15d60 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
15d70 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15d80 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
15d90 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
15da0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15db0 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
15dc0 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
15dd0 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
15de0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15df0 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
15e00 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15e10 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
15e20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
15e30 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
15e40 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
15e50 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
15e60 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
15e70 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
15e80 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
15e90 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
15ea0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
15eb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15ec0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15ed0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
15ee0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
15ef0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
15f00 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
15f10 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
15f20 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
15f30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15f40 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15f50 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
15f60 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
15f70 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
15f80 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
15f90 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
15fa0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
15fb0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
15fc0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
15fd0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
15fe0 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
15ff0 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
16000 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
16010 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
16020 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
16030 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
16040 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
16050 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
16060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
16080 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16090 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
160a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
160b0 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
160c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
160d0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
160e0 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
160f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16100 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
16110 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
16120 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
16130 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
16140 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
16150 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
16160 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
16170 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
16180 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
16190 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
161a0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
161b0 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
161c0 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
161d0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
161e0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
161f0 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
16200 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
16210 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
16220 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
16230 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
16240 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
16250 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
16260 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
16270 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
16280 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
16290 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
162a0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
162b0 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
162c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
162d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
162e0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
162f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16300 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
16310 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
16320 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
16330 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
16340 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
16350 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
16360 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
16370 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
16380 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
16390 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
163a0 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
163b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
163c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
163d0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
163e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
163f0 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72 65  played by before
16400 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16410 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
16420 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
16430 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
16440 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
16450 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16460 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16470 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16480 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16490 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
164a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
164b0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
164c0 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
164d0 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
164e0 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
164f0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16500 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16510 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
16520 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
16530 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
16540 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
16550 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16560 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16570 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16580 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16590 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
165a0 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
165b0 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
165c0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
165d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
165e0 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
165f0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16600 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16610 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
16620 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
16630 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
16640 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
16650 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16660 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16680 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16690 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
166a0 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
166b0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
166c0 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
166d0 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
166e0 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
166f0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16700 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16710 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16720 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
16730 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
16740 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16750 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16760 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16770 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16780 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16790 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
167a0 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
167b0 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
167c0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
167d0 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
167e0 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
167f0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16800 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16810 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
16820 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
16830 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
16840 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
16850 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
16860 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
16870 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
16880 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
16890 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
168a0 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
168b0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
168c0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
168d0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
168e0 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
168f0 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
16900 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
16910 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
16920 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
16930 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
16940 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
16950 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
16960 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
16970 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
16980 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
16990 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
169a0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
169b0 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
169c0 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
169d0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
169e0 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
169f0 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
16a00 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
16a10 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
16a20 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
16a30 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
16a40 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
16a50 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
16a60 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
16a70 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
16a80 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
16a90 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
16aa0 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
16ab0 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
16ac0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
16ad0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
16ae0 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
16af0 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
16b00 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
16b10 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
16b20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
16b30 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
16b40 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
16b50 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
16b60 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
16b70 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
16b80 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
16b90 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
16ba0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
16bb0 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
16bc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16bd0 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
16be0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
16bf0 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
16c00 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
16c10 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
16c20 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
16c30 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
16c40 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16c50 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
16c60 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16c70 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
16c80 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
16c90 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
16ca0 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
16cb0 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
16cc0 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
16cd0 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
16ce0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
16cf0 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
16d00 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
16d10 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
16d20 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
16d30 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
16d40 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
16d50 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
16d60 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
16d70 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
16d80 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
16d90 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
16da0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
16db0 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
16dc0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
16dd0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
16de0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
16df0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
16e00 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
16e10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
16e20 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
16e30 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50  || pPg==0 );.  P
16e40 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
16e50 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
16e60 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
16e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
16e80 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
16e90 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
16ea0 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
16eb0 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
16ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
16ed0 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
16ee0 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
16ef0 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
16f00 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
16f10 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
16f20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
16f30 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
16f40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
16f50 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
16f60 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
16f70 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
16f80 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
16f90 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
16fa0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
16fb0 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
16fc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16fd0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
16fe0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
16ff0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
17000 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
17010 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
17020 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
17030 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
17040 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
17050 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17060 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17070 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17080 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17090 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
170a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
170b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
170c0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
170d0 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
170e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
170f0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
17100 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
17110 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
17120 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
17130 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
17140 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17150 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
17160 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
17170 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17180 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
17190 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
171a0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
171b0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
171c0 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
171d0 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
171e0 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
171f0 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
17200 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
17210 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
17220 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
17230 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
17240 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
17250 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
17260 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
17270 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
17280 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
17290 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
172a0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
172b0 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
172c0 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
172d0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
172e0 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
172f0 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
17300 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
17310 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
17320 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
17330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
17340 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
17350 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
17360 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
17370 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
17380 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
17390 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
173a0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
173b0 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
173c0 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
173d0 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
173e0 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
173f0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
17400 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
17410 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
17420 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
17430 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17440 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
17450 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
17460 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
17470 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
17480 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
17490 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
174a0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
174b0 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
174c0 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
174d0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
174e0 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
174f0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
17500 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
17510 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
17520 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
17530 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
17540 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
17550 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
17560 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
17570 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
17580 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
17590 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
175a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
175b0 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
175c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
175d0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
175e0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
175f0 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20  LLBACK)==0 );.  
17600 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
17610 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
17620 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
17630 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17640 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
17650 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
17660 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
17670 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
17680 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
17690 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20  LBACK)!=0 );.   
176a0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
176b0 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
176c0 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
176d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
176e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
176f0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
17700 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
17710 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
17720 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
17730 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
17740 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
17750 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
17760 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
17770 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
17780 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
17790 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
177a0 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
177b0 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
177c0 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
177d0 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
177e0 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
177f0 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
17800 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
17810 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
17820 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
17830 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
17840 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
17850 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
17860 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
17870 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
17880 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
17890 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
178a0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
178b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
178c0 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  a, (u8*)aData, p
178d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
178e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52  ;.    pPager->xR
178f0 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
17900 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
17910 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
17920 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
17930 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
17940 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
17950 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
17960 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
17970 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
17980 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
17990 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
179a0 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
179b0 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
179c0 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
179d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
179e0 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
179f0 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
17a00 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
17a10 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
17a20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
17a30 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
17a40 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
17a50 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
17a60 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
17a70 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ase..      **.  
17a80 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
17a90 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
17aa0 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
17ab0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
17ac0 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
17ad0 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
17ae0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
17af0 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
17b00 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
17b10 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
17b20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
17b30 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
17b40 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
17b50 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
17b60 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
17b70 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
17b80 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
17b90 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
17ba0 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
17bb0 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
17bc0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17bd0 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
17be0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
17bf0 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
17c00 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
17c10 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
17c20 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
17c30 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
17c40 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
17c50 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
17c60 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
17c70 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
17c80 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
17c90 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
17ca0 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
17cb0 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
17cc0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17cd0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
17ce0 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
17cf0 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
17d00 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
17d10 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
17d20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17d30 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
17d40 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
17d50 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
17d60 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
17d70 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
17d80 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
17d90 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
17da0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17db0 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
17dc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
17dd0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
17de0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
17df0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17e00 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
17e10 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
17e20 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
17e30 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
17e40 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
17e50 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
17e60 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
17e70 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
17e80 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
17e90 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
17ea0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
17eb0 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
17ec0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
17ed0 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
17ee0 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
17ef0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
17f00 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
17f10 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
17f20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
17f30 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
17f40 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
17f50 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
17f60 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
17f70 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
17f80 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
17f90 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
17fa0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
17fb0 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
17fc0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
17fd0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
17fe0 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
17ff0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
18000 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
18010 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18020 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
18030 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
18040 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
18050 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
18060 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
18070 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
18080 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
18090 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
180a0 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
180b0 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
180c0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
180d0 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
180e0 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
180f0 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
18100 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
18110 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
18120 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
18130 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18140 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
18150 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
18160 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
18170 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
18180 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
18190 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
181a0 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
181b0 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
181c0 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
181d0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
181e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
181f0 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
18200 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
18210 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
18220 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
18230 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
18240 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
18250 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
18260 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
18270 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
18280 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
18290 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
182a0 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
182b0 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
182c0 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
182d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
182e0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
182f0 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
18300 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
18310 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
18320 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
18330 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
18340 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
18350 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
18360 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
18370 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
18380 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
18390 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
183a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
183b0 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
183c0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
183d0 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
183e0 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
183f0 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
18400 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
18410 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
18420 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
18430 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
18440 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18450 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
18460 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
18470 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18480 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
18490 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
184a0 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
184b0 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
184c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
184d0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
184e0 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
184f0 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
18500 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
18510 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
18520 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
18530 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
18540 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
18550 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
18560 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
18570 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
18580 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
18590 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
185a0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
185b0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
185c0 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
185d0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
185e0 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
185f0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
18600 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
18610 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
18620 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
18630 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
18640 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
18650 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
18660 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
18670 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
18680 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
18690 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
186a0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
186b0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
186c0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
186d0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
186e0 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
186f0 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
18700 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
18710 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
18720 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
18730 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
18740 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
18750 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
18760 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
18770 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
18780 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
18790 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
187a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
187b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
187c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
187d0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
187e0 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
187f0 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
18800 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18810 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
18820 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
18830 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
18840 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
18850 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
18860 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
18870 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
18880 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
18890 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
188a0 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
188b0 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
188c0 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
188d0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
188e0 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
188f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
18900 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
18910 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
18920 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
18930 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
18940 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
18950 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
18960 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
18970 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
18980 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
18990 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
189a0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
189b0 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
189c0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
189d0 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
189e0 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
189f0 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
18a00 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
18a10 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
18a20 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
18a30 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
18a40 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
18a50 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
18a60 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
18a70 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
18a80 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
18a90 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
18aa0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
18ab0 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
18ac0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
18ad0 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
18ae0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18af0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
18b00 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
18b10 20 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51   flags = .#if SQ
18b20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
18b30 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
18b40 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
18b50 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
18b60 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
18b70 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
18b80 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
18b90 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18ba0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
18bb0 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
18bc0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18bd0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
18be0 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
18bf0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
18c00 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18c10 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
18c20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
18c30 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
18c40 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
18c50 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
18c60 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  .  ** sqlite3_ma
18c70 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
18c80 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
18c90 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20  Journal.   Also 
18ca0 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66  obtain.  ** suff
18cb0 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e  icient space (in
18cc0 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20   zMasterPtr) to 
18cd0 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f  hold the names o
18ce0 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f  f master.  ** jo
18cf0 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72  urnal files extr
18d00 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c  acted from regul
18d10 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  ar rollback-jour
18d20 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  nals..  */.  rc 
18d30 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
18d40 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
18d50 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
18d60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d70 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
18d80 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74  ter_out;.  nMast
18d90 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
18da0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d  Pathname+1;.  zM
18db0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73  asterJournal = s
18dc0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61  qlite3Malloc(nMa
18dd0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
18de0 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
18df0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
18e00 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
18e10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18e20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
18e30 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61  r_out;.  }.  zMa
18e40 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
18e50 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
18e60 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72  rJournal+1];.  r
18e70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
18e80 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
18e90 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29  erJournal, (int)
18ea0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
18eb0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
18ec0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18ed0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18ee0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
18ef0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d  MasterJournal] =
18f00 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20   0;..  zJournal 
18f10 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
18f20 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75  ;.  while( (zJou
18f30 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
18f40 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
18f50 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  nal ){.    int e
18f60 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20  xists;.    rc = 
18f70 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
18f80 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
18f90 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
18fa0 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
18fb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18fc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
18fd0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18fe0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
18ff0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
19000 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
19010 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
19020 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
19030 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
19040 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69  .      ** Open i
19050 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
19060 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
19070 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
19080 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  If.      ** so, 
19090 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
190a0 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
190b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
190c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
190d0 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74  int c;.      int
190e0 20 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51   flags = .#if SQ
190f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
19100 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
19110 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73      (pPager->vfs
19120 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
19130 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e  N_FILEPROTECTION
19140 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20  _MASK)|.#endif. 
19150 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
19160 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19170 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
19180 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
19190 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
191a0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
191b0 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
191c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
191d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
191e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
191f0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19200 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
19210 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
19220 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
19230 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
19240 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
19250 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
19260 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
19270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19280 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19290 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
192a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
192b0 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
192c0 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
192d0 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
192e0 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
192f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
19300 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
19310 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
19320 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19330 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
19340 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19350 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
19360 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
19370 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
19380 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
19390 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
193a0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
193b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
193c0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
193d0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
193e0 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
193f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
19400 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19410 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
19420 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19430 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
19440 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19450 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
19460 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
19470 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
19480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
19490 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
194a0 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
194b0 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
194c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
194d0 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
194e0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
194f0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
19500 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
19510 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
19520 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
19530 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
19540 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
19550 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
19560 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
19570 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
19580 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
19590 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
195a0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
195b0 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
195c0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
195d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
195e0 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
195f0 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
19600 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
19610 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
19620 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
19630 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
19640 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
19650 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
19660 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
19670 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
19680 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
19690 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
196a0 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
196b0 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
196c0 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  r, it might be t
196d0 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
196e0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
196f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
19700 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
19710 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
19720 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
19730 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
19740 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
19750 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
19760 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
19770 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
19780 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
19790 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
197a0 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
197b0 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
197c0 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
197d0 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
197e0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
197f0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
19800 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
19810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
19820 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
19830 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
19840 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
19850 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
19860 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
19870 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
19880 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
19890 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
198a0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
198b0 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
198c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
198d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
198e0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
198f0 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
19900 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
19910 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
19920 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  .  .  if( isOpen
19930 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  (pPager->fd) .  
19940 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
19950 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
19960 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
19970 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
19980 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20  _OPEN) .  ){.   
19990 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
199a0 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69  , newSize;.    i
199b0 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67  nt szPage = pPag
199c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
199d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
199e0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
199f0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f  VE_LOCK );.    /
19a00 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
19a10 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
19a20 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
19a30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
19a40 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
19a50 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
19a60 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
19a70 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28  wSize = szPage*(
19a80 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
19a90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19aa0 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
19ab0 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19ac0 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
19ad0 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
19ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19af0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
19b00 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
19b10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19b20 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73  ( (currentSize+s
19b30 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20  zPage)<=newSize 
19b40 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
19b50 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e  *pTmp = pPager->
19b60 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20  pTmpSpace;.     
19b70 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20     memset(pTmp, 
19b80 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  0, szPage);.    
19b90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
19ba0 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d  ewSize-szPage) =
19bb0 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b  = currentSize );
19bc0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19bd0 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
19be0 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69  ge) >  currentSi
19bf0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ze );.        rc
19c00 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
19c10 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54  e(pPager->fd, pT
19c20 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53  mp, szPage, newS
19c30 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20  ize-szPage);.   
19c40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
19c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19c60 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19c70 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
19c80 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
19c90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
19ca0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
19cb0 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76  rn a sanitized v
19cc0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65  ersion of the se
19cd0 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20  ctor-size of OS 
19ce0 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a  file pFile. The.
19cf0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
19d00 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
19d10 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20   lie between 32 
19d20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  and MAX_SECTOR_S
19d30 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IZE..*/.int sqli
19d40 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71  te3SectorSize(sq
19d50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
19d60 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d  e){.  int iRet =
19d70 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
19d80 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69  Size(pFile);.  i
19d90 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20  f( iRet<32 ){.  
19da0 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20    iRet = 512;.  
19db0 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d  }else if( iRet>M
19dc0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
19dd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
19de0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
19df0 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d  12 );.    iRet =
19e00 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19e10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
19e20 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Ret;.}../*.** Se
19e30 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
19e40 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
19e50 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
19e60 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
19e70 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
19e80 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19e90 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
19ea0 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
19eb0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
19ec0 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
19ed0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
19ee0 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
19ef0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
19f00 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
19f10 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
19f20 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
19f30 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
19f40 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
19f50 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
19f60 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
19f70 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
19f80 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19f90 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
19fa0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
19fb0 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
19fc0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
19fd0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
19fe0 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
19ff0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1a000 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1a010 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
1a020 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
1a030 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
1a040 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
1a050 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
1a060 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
1a070 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
1a080 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
1a090 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _SIZE..**.** If 
1a0a0 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65  the file has the
1a0b0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1a0c0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a0d0 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  E property, then
1a0e0 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65   set.** the effe
1a0f0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a100 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d  e to its minimum
1a110 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54   value (512).  T
1a120 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a  he purpose of.**
1a130 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1a140 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65  ize is to define
1a150 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69   the "blast radi
1a160 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61  us" of bytes tha
1a170 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
1a180 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63  e if a crash occ
1a190 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e  urs while writin
1a1a0 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79  g to a single by
1a1b0 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61  te in.** that ra
1a1c0 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50  nge.  But with P
1a1d0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a1e0 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61  TE, the blast ra
1a1f0 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  dius is zero.** 
1a200 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f  (that is what PO
1a210 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a220 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20  E means), so we 
1a230 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63  minimize the sec
1a240 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f  tor.** size.  Fo
1a250 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
1a260 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  atibility of the
1a270 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a280 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a  l file format,.*
1a290 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75  * we cannot redu
1a2a0 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1a2b0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c   sector size bel
1a2c0 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69  ow 512..*/.stati
1a2d0 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
1a2e0 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
1a2f0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
1a300 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a310 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1a320 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
1a330 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a340 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
1a350 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1a360 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1a370 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20  d) & .          
1a380 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1a390 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a3a0 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RITE)!=0.  ){.  
1a3b0 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
1a3c0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
1a3d0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1a3e0 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
1a3f0 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
1a400 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
1a410 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
1a420 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
1a430 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1a440 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
1a450 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ult. */.    pPag
1a460 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1a470 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   512;.  }else{. 
1a480 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a490 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53  rSize = sqlite3S
1a4a0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1a4b0 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->fd);.  }.}../*
1a4c0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
1a4d0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
1a4e0 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
1a4f0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
1a500 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
1a510 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
1a520 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
1a530 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
1a540 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a550 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
1a560 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
1a570 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
1a580 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
1a590 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
1a5a0 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
1a5b0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a5c0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1a5d0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
1a5e0 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
1a5f0 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
1a600 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
1a610 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1a620 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
1a630 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
1a640 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
1a650 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
1a660 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
1a670 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
1a680 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a690 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
1a6a0 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
1a6b0 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
1a6c0 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
1a6d0 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
1a6e0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a6f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1a700 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
1a710 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
1a720 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
1a730 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
1a740 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a750 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a760 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
1a770 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
1a780 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
1a790 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
1a7a0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
1a7b0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a7c0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a7d0 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
1a7e0 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
1a7f0 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
1a800 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
1a810 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
1a820 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
1a830 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
1a840 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
1a850 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1a860 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1a870 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
1a880 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1a890 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
1a8a0 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
1a8b0 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
1a8c0 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
1a8d0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1a8e0 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
1a8f0 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
1a900 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
1a910 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
1a920 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
1a930 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
1a940 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
1a950 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
1a960 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
1a970 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
1a980 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
1a990 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
1a9a0 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1a9b0 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
1a9c0 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
1a9d0 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
1a9e0 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
1a9f0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1aa00 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
1aa10 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
1aa20 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
1aa30 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
1aa40 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
1aa50 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
1aa60 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
1aa70 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1aa80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
1aa90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1aaa0 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
1aab0 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
1aac0 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
1aad0 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
1aae0 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
1aaf0 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
1ab00 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
1ab10 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
1ab20 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
1ab30 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
1ab40 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
1ab50 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
1ab60 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
1ab70 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
1ab80 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
1ab90 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1aba0 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
1abb0 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
1abc0 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
1abd0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
1abe0 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
1abf0 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
1ac00 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
1ac10 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
1ac20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
1ac30 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
1ac40 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
1ac50 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
1ac60 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
1ac70 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
1ac80 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1ac90 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
1aca0 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
1acb0 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
1acc0 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
1acd0 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
1ace0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1acf0 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
1ad00 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
1ad10 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
1ad20 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
1ad30 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
1ad40 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
1ad50 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
1ad60 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
1ad70 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
1ad80 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1ad90 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
1ada0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
1adb0 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
1adc0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1add0 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
1ade0 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
1adf0 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
1ae00 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
1ae10 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
1ae20 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1ae30 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
1ae40 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
1ae50 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
1ae60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1ae70 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
1ae80 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
1ae90 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
1aea0 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1aeb0 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
1aec0 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
1aed0 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
1aee0 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
1aef0 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
1af00 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
1af10 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
1af20 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
1af30 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
1af40 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
1af50 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1af60 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
1af70 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
1af80 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
1af90 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
1afa0 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
1afb0 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
1afc0 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
1afd0 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
1afe0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
1aff0 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
1b000 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1b010 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
1b020 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b030 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1b040 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
1b050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b060 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1b070 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
1b080 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b0a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
1b0b0 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
1b0c0 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0e0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1b0f0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
1b100 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
1b110 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b120 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
1b130 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
1b140 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b160 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
1b170 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b180 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
1b190 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1b1a0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1b1b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1b1c0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1b1d0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1b1e0 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
1b1f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1b200 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
1b210 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
1b220 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
1b230 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
1b240 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
1b250 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  back */.  int nP
1b260 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20  layback = 0;    
1b270 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1b280 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74  er of pages rest
1b290 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ored from journa
1b2a0 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  l */..  /* Figur
1b2b0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
1b2c0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
1b2d0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
1b2e0 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
1b2f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
1b300 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
1b310 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1b320 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
1b330 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1b340 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1b350 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
1b360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b370 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b380 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
1b390 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
1b3a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
1b3b0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b3c0 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
1b3d0 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
1b3e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b3f0 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
1b400 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
1b410 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
1b420 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
1b430 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1b440 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
1b450 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1b460 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
1b470 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
1b480 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
1b490 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1b4a0 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
1b4b0 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
1b4c0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
1b4d0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
1b4e0 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
1b4f0 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
1b500 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
1b510 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b520 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
1b530 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
1b540 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
1b550 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61  ,.  **  mxPathna
1b560 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1b570 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1b580 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1b590 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1b5a0 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1b5b0 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1b5c0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1b5d0 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1b5e0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1b5f0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1b600 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1b610 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1b620 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b630 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1b640 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1b650 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1b660 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1b670 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1b680 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1b690 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1b6a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b6b0 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1b6c0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1b6d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1b6e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1b6f0 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1b700 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1b710 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1b720 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1b730 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1b740 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1b750 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1b760 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1b770 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1b780 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1b790 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1b7a0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1b7b0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1b7c0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1b7d0 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1b7e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1b7f0 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1b800 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1b810 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1b820 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1b830 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1b840 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1b850 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1b860 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1b870 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1b880 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1b890 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1b8a0 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1b8b0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1b8c0 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1b8d0 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1b8e0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1b8f0 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1b900 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1b910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b920 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1b930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1b940 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b960 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1b970 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1b980 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1b990 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1b9a0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1b9b0 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1b9c0 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1b9d0 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1b9e0 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1b9f0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1ba00 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1ba10 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1ba20 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1ba30 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1ba40 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1ba50 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1ba60 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1ba70 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1ba80 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1ba90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1baa0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1bab0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1bac0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1bad0 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1bae0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1baf0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1bb00 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1bb10 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1bb20 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1bb30 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1bb40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1bb50 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1bb60 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1bb70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1bb80 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1bb90 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1bba0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1bbb0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1bbc0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1bbd0 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1bbe0 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1bbf0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1bc00 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1bc10 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1bc20 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1bc30 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1bc40 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1bc50 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1bc60 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1bc70 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1bc80 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1bc90 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1bca0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1bcb0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1bcc0 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1bcd0 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1bce0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1bcf0 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1bd00 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1bd10 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1bd20 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1bd30 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1bd40 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1bd50 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1bd60 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1bd70 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1bd80 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1bd90 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1bda0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1bdb0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1bdc0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1bdd0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1bde0 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1bdf0 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1be00 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1be10 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1be20 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1be30 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1be40 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1be50 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1be60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1be70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1be80 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1be90 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1bea0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1beb0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1bec0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1bed0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1bee0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1bef0 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1bf00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1bf10 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1bf20 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1bf30 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1bf40 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1bf50 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1bf60 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1bf70 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1bf80 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1bf90 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1bfa0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1bfb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1bfc0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1bfd0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1bfe0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1bff0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1c000 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1c010 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c020 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1c030 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c050 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1c060 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1c070 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1c080 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1c090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1c0a0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1c0b0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1c0c0 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1c0d0 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1c0e0 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1c0f0 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1c100 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1c110 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1c120 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1c130 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1c140 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1c150 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1c160 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1c170 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1c180 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1c190 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1c1a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c1b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
1c1c0 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20  Playback++;.    
1c1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c1e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c1f0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c200 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c210 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1c220 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c230 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1c240 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1c250 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1c260 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1c270 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1c280 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1c290 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1c2a0 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1c2b0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1c2c0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1c2d0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1c2e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1c2f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1c300 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1c310 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1c320 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1c330 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1c340 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1c350 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1c360 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1c370 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1c380 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1c390 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1c3a0 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1c3b0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1c3c0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1c3d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c3e0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1c3f0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c400 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c410 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1c420 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1c430 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1c440 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1c450 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1c460 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1c470 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1c480 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1c490 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1c4a0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1c4b0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1c4c0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1c4d0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1c4e0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1c4f0 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1c500 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1c510 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1c520 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1c530 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1c540 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c550 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c570 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1c580 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1c590 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1c5a0 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
1c5b0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
1c5c0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1c5d0 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
1c5e0 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
1c5f0 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
1c600 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
1c610 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
1c620 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
1c630 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1c640 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
1c650 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
1c660 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
1c670 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
1c680 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c690 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
1c6a0 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  fied..  */.#ifde
1c6b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1c6c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
1c6d0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1c6e0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
1c6f0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
1c700 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1c710 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1c720 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1c730 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
1c740 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
1c750 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
1c760 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1c770 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
1c780 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
1c790 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
1c7a0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1c7b0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
1c7c0 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
1c7d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
1c7e0 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
1c7f0 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1c800 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
1c810 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
1c820 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
1c830 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
1c840 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
1c850 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
1c860 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
1c870 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
1c880 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
1c890 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
1c8a0 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
1c8b0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1c8c0 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
1c8d0 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
1c8e0 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
1c8f0 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
1c900 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
1c910 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1c920 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
1c930 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
1c940 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
1c950 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
1c960 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1c970 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
1c980 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1c990 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1c9a0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1c9b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c9c0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
1c9d0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1c9e0 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
1c9f0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1ca00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1ca10 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1ca20 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1ca30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1ca40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ca50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1ca60 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
1ca70 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1ca80 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1ca90 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1caa0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1cab0 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  N).  ){.    rc =
1cac0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1cad0 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
1cae0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1caf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1cb00 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1cb10 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1cb20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
1cb30 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61  , 0);.    testca
1cb40 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cb50 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cb60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cb70 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
1cb80 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
1cb90 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
1cba0 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
1cbb0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1cbc0 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
1cbd0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
1cbe0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
1cbf0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1cc00 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
1cc10 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
1cc20 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
1cc30 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1cc40 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1cc50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1cc60 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e    if( isHot && n
1cc70 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20  Playback ){.    
1cc80 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
1cc90 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
1cca0 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63  R_ROLLBACK, "rec
1ccb0 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20  overed %d pages 
1ccc0 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20  from %s",.      
1ccd0 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62            nPlayb
1cce0 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ack, pPager->zJo
1ccf0 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  urnal);.  }..  /
1cd00 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1cd10 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1cd20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1cd30 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1cd40 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1cd50 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1cd60 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1cd70 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1cd80 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1cd90 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1cda0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1cdb0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1cdc0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1cdd0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1cde0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1cdf0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1ce00 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1ce10 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1ce20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce30 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
1ce40 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1ce50 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1ce60 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1ce70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ce80 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1ce90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1cea0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1ceb0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1cec0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1ced0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1cee0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1cef0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1cf00 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1cf10 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1cf20 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1cf30 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1cf40 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1cf50 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1cf60 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1cf70 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1cf80 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1cf90 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1cfa0 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75  ge(PgHdr *pPg, u
1cfb0 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61  32 iFrame){.  Pa
1cfc0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1cfd0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1cfe0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1cff0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1d000 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1d010 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1d020 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1d030 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1d040 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d050 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1d060 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1d070 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1d080 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1d090 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1d0a0 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1d0b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d0c0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1d0d0 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1d0e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1d0f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1d100 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1d110 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66  TE_OMIT_WAL.  if
1d120 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ( iFrame ){.    
1d130 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1d140 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1d150 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1d160 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1d170 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d  lite3WalReadFram
1d180 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1d190 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50  iFrame, pgsz, pP
1d1a0 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c  g->pData);.  }el
1d1b0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
1d1c0 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
1d1d0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1d1e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1d1f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d200 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1d210 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1d220 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  gsz, iOffset);. 
1d230 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d240 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1d250 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
1d260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d270 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
1d280 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1d290 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1d2a0 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1d2b0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1d2c0 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1d2d0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1d2e0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1d2f0 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1d300 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1d310 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1d320 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1d330 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1d340 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d350 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1d360 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1d370 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1d380 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1d390 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1d3a0 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1d3b0 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1d3c0 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1d3d0 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1d3e0 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1d3f0 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1d400 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1d410 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1d420 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1d430 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1d440 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1d450 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1d460 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1d470 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1d480 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1d490 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1d4a0 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1d4b0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1d4c0 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1d4d0 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1d4e0 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1d4f0 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
1d500 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1d510 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1d520 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1d530 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1d540 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1d550 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1d560 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d570 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1d580 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1d590 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1d5a0 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1d5b0 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1d5c0 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1d5d0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1d5e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d5f0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1d600 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1d610 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1d620 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1d630 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1d640 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1d650 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
1d660 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1d670 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1d680 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1d690 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1d6a0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1d6b0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1d6c0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1d6d0 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1d6e0 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1d6f0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1d700 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d710 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1d720 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1d730 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1d740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d750 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1d760 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1d770 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1d780 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1d790 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1d7a0 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1d7b0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1d7c0 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1d7d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1d7e0 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1d7f0 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1d800 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1d810 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1d820 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1d830 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1d840 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d850 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1d860 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1d870 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1d880 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1d890 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1d8a0 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1d8b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1d8c0 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1d8d0 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1d8e0 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1d8f0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1d900 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1d910 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1d920 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1d930 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1d940 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1d950 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1d960 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1d970 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1d980 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1d990 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d9a0 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1d9b0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1d9c0 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1d9d0 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1d9e0 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1d9f0 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1da00 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1da10 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1da20 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1da30 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1da40 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1da50 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1da60 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1da70 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1da80 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1da90 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1daa0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1dab0 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1dac0 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1dad0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dae0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1daf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1db00 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1db10 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1db20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1db30 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1db40 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1db50 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1db60 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1db70 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1db80 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1db90 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1dba0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1dbb0 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1dbc0 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1dbd0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1dbe0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1dbf0 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1dc00 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1dc10 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1dc20 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1dc30 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1dc40 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1dc50 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1dc60 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1dc70 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1dc80 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1dc90 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1dca0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1dcb0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1dcc0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1dcd0 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1dce0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1dcf0 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1dd00 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1dd10 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1dd20 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1dd30 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1dd40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1dd50 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1dd60 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1dd70 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1dd80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1dd90 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1dda0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1ddb0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
1ddc0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1ddd0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67  pPager) );.  pPg
1dde0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
1ddf0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
1de00 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
1de10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1de20 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
1de30 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
1de40 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1de50 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
1de60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
1de70 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20   iFrame = 0;.   
1de80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1de90 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
1dea0 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70  er->pWal, pPg->p
1deb0 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
1dec0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ded0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dee0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1def0 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
1df00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1df10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1df20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1df30 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1df40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1df50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1df60 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
1df70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1df80 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74  Normally, if a t
1df90 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1dfa0 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62  lled back, any b
1dfb0 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1dfc0 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64  are.  ** updated
1dfd0 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69   as data is copi
1dfe0 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f  ed out of the ro
1dff0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
1e000 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nd into the.  **
1e010 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
1e020 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79  is not generally
1e030 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61   possible with a
1e040 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61   WAL database, a
1e050 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  s.  ** rollback 
1e060 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20  involves simply 
1e070 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c  truncating the l
1e080 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f  og file. Therefo
1e090 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  re, if one.  ** 
1e0a0 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68  or more frames h
1e0b0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1e0c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1e0d0 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f  log (and therefo
1e0e0 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f  re .  ** also co
1e0f0 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61  pied into the ba
1e100 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20  ckup databases) 
1e110 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1e120 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a  transaction,.  *
1e130 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75  * the backups mu
1e140 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  st be restarted.
1e150 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
1e160 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
1e170 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a  ger->pBackup);..
1e180 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e190 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e1a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1e1b0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   rollback a tran
1e1c0 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c  saction on a WAL
1e1d0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1e1e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f  atic int pagerRo
1e1f0 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20  llbackWal(Pager 
1e200 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e210 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1e220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e230 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
1e240 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20  PgHdr *pList;   
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79  /* List of dirty
1e270 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74   pages to revert
1e280 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c   */..  /* For al
1e290 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  l pages in the c
1e2a0 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75  ache that are cu
1e2b0 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72  rrently dirty or
1e2c0 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
1e2d0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
1e2e0 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74  (but not committ
1e2f0 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ed) to the log f
1e300 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74  ile, do one of t
1e310 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  he .  ** followi
1e320 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
1e330 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  + Discard the ca
1e340 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65  ched page (if re
1e350 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20  fcount==0), or. 
1e360 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70   **   + Reload p
1e370 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  age content from
1e380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
1e390 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20  f refcount>0).. 
1e3a0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
1e3b0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1e3c0 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20  bOrigSize;.  rc 
1e3d0 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f  = sqlite3WalUndo
1e3e0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1e3f0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1e400 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
1e410 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
1e420 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1e430 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1e440 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  che);.  while( p
1e450 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
1e460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
1e470 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
1e480 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
1e490 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1e4a0 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
1e4b0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
1e4c0 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
1e4d0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
1e4e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e4f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e500 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1e510 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1e520 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1e530 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1e540 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1e550 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1e560 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1e570 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1e580 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1e590 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1e5a0 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1e5b0 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1e5c0 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1e5d0 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  .** changed. .**
1e5e0 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
1e5f0 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74  pages passed int
1e600 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1e610 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
1e620 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
1e630 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67  ** Hence, if pag
1e640 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77  e 1 appears anyw
1e650 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  here on the list
1e660 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65  , it will be the
1e670 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20   first page..*/ 
1e680 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e690 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1e6a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e6c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1e6d0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1e700 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1e710 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1e740 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1e750 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1e760 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1e770 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e780 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1e790 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mmit */.){.  int
1e7a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e7c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1e7d0 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1e800 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a  ges in pList */.
1e810 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1e820 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1e830 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43  ined(SQLITE_CHEC
1e840 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48 64 72  K_PAGES).  PgHdr
1e850 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1e860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1e870 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
1e880 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ages */.#endif..
1e890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e8a0 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65  ->pWal );.  asse
1e8b0 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66  rt( pList );.#if
1e8c0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1e8d0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1e8e0 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20  t the page list 
1e8f0 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  is in accending 
1e900 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70  order */.  for(p
1e910 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e  =pList; p && p->
1e920 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69  pDirty; p=p->pDi
1e930 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74  rty){.    assert
1e940 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70  ( p->pgno < p->p
1e950 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20  Dirty->pgno );. 
1e960 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1e970 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72  ert( pList->pDir
1e980 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69  ty==0 || isCommi
1e990 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d  t );.  if( isCom
1e9a0 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mit ){.    /* If
1e9b0 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1e9c0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  on is being comm
1e9d0 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  itted, there is 
1e9e0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74  no point in writ
1e9f0 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70  ing.    ** any p
1ea00 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e  ages with page n
1ea10 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74  umbers greater t
1ea20 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e  han nTruncate in
1ea30 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e  to the WAL file.
1ea40 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c  .    ** They wil
1ea50 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  l never be read 
1ea60 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53  by any client. S
1ea70 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  o remove them fr
1ea80 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20  om the pDirty.  
1ea90 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20    ** list here. 
1eaa0 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  */.    PgHdr *p;
1eab0 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e  .    PgHdr **ppN
1eac0 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20  ext = &pList;.  
1ead0 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    nList = 0;.   
1eae0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a   for(p=pList; (*
1eaf0 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20  ppNext = p)!=0; 
1eb00 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1eb10 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1eb20 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  =nTruncate ){.  
1eb30 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26        ppNext = &
1eb40 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  p->pDirty;.     
1eb50 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20     nList++;.    
1eb60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1eb70 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1eb80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73   }else{.    nLis
1eb90 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 1;.  }.  pPa
1eba0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
1ebb0 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20  _STAT_WRITE] += 
1ebc0 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c  nList;..  if( pL
1ebd0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1ebe0 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1ebf0 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1ec00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1ec10 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1ec20 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1ec30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1ec40 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1ec50 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67  , isCommit, pPag
1ec60 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
1ec70 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1ec80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1ec90 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
1eca0 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1ecb0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1ecc0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ecd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
1ece0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
1ecf0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67  ->pBackup, p->pg
1ed00 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61  no, (u8 *)p->pDa
1ed10 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1ed20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1ed30 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73  ECK_PAGES.  pLis
1ed40 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1ed50 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1ed60 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66  r->pPCache);.  f
1ed70 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1ed80 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1ed90 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
1eda0 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  ash(p);.  }.#end
1edb0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
1edc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
1edd0 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
1ede0 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a  on on the WAL..*
1edf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ee00 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c  e used to be cal
1ee10 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e  led "pagerOpenSn
1ee20 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73  apshot()" becaus
1ee30 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79  e it essentially
1ee40 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70  .** makes a snap
1ee50 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61  shot of the data
1ee60 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72  base at the curr
1ee70 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  ent point in tim
1ee80 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a  e and preserves.
1ee90 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  ** that snapshot
1eea0 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
1eeb0 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20  reader in spite 
1eec0 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20  of concurrently 
1eed0 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74  changes by.** ot
1eee0 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63  her writers or c
1eef0 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  heckpointers..*/
1ef00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1ef10 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
1ef20 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
1ef30 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1ef60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1ef70 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20  changed = 0;    
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ef90 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73  rue if cache mus
1efa0 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20  t be reset */.. 
1efb0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1efc0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1efd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1efe0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1eff0 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
1f000 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
1f010 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71  ADER );..  /* sq
1f020 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1f030 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73  ransaction() was
1f040 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20   not called for 
1f050 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a  the previous.  *
1f060 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  * transaction in
1f070 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
1f080 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c  CLUSIVE.  So cal
1f090 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65  l it now.  If we
1f0a0 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63  .  ** are in loc
1f0b0 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c  king_mode=NORMAL
1f0c0 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77   and EndRead() w
1f0d0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  as previously ca
1f0e0 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64  lled,.  ** the d
1f0f0 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73  uplicate call is
1f100 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
1f110 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
1f120 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1f130 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1f140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1f150 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1f160 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1f170 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20  l, &changed);.  
1f180 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f190 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a  K || changed ){.
1f1a0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1f1b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1f1c0 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
1f1d0 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66  ) ) sqlite3OsUnf
1f1e0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
1f1f0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
1f200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1f210 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
1f220 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1f230 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1f240 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
1f250 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74   PAGER_OPEN.** t
1f260 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
1f270 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  tate to determin
1f280 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1f290 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1f2a0 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73  ** in pages (ass
1f2b0 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73  uming the page s
1f2c0 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ize currently st
1f2d0 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61  ored in Pager.pa
1f2e0 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  geSize)..**.** I
1f2f0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1f300 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1f310 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1f320 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f330 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65  abase.** in page
1f340 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  s is stored in *
1f350 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73  pnPage. Otherwis
1f360 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
1f370 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c   (perhaps.** SQL
1f380 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
1f390 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1f3a0 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
1f3b0 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a   unmodified..*/.
1f3c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1f3d0 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1f3e0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70  *pPager, Pgno *p
1f3f0 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1f400 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1f410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1f420 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
1f430 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
1f440 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20  * Query the WAL 
1f450 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  sub-system for t
1f460 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f470 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28  . The WalDbsize(
1f480 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ).  ** function 
1f490 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  returns zero if 
1f4a0 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f  the WAL is not o
1f4b0 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e  pen (i.e. Pager.
1f4c0 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  pWal==0), or.  *
1f4d0 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
1f4e0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76  e size is not av
1f4f0 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74  ailable. The dat
1f500 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1f510 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  t.  ** available
1f520 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1f530 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20  b-system if the 
1f540 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74  log file is empt
1f550 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  y or.  ** contai
1f560 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d  ns no valid comm
1f570 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
1f580 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ns..  */.  asser
1f590 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1f5a0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
1f5b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f5c0 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
1f5d0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65  _LOCK );.  nPage
1f5e0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73   = sqlite3WalDbs
1f5f0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
1f600 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1f610 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1f620 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
1f630 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
1f640 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65  -system,.  ** de
1f650 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64  termine it based
1f660 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20   on the size of 
1f670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f680 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20  e. If the size. 
1f690 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
1f6a0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
1f6b0 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
1f6c0 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
1f6d0 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64  size,.  ** round
1f6e0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61   down to the nea
1f6f0 72 65 73 74 20 70 61 67 65 2e 20 45 78 63 65 70  rest page. Excep
1f700 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67  t, any file larg
1f710 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62  er than 0.  ** b
1f720 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20  ytes in size is 
1f730 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f  considered to co
1f740 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f  ntain at least o
1f750 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ne page..  */.  
1f760 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1f770 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f790 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20    /* Size of db 
1f7a0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1f7b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
1f7c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1f7d0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1f7e0 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
1f7f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1f800 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
1f810 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1f820 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1f830 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  , &n);.      if(
1f840 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f850 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1f860 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1f870 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28   }.    nPage = (
1f880 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d  Pgno)((n+pPager-
1f890 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70  >pageSize-1) / p
1f8a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1f8b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1f8c0 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
1f8d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1f8e0 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
1f8f0 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
1f900 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
1f910 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
1f920 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
1f930 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
1f940 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
1f950 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
1f960 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
1f970 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1f980 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
1f990 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
1f9a0 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
1f9b0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1f9c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f9d0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1f9e0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1f9f0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
1fa00 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
1fa10 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1fa20 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1fa30 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
1fa40 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
1fa50 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
1fa60 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
1fa70 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fa80 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
1fa90 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
1faa0 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
1fab0 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
1fac0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1fad0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1fae0 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
1faf0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
1fb00 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
1fb10 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
1fb20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1fb30 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
1fb40 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
1fb50 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
1fb60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
1fb70 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
1fb80 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
1fb90 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
1fba0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1fbb0 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
1fbc0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
1fbd0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1fbe0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1fbf0 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
1fc00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1fc10 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
1fc20 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
1fc30 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
1fc40 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1fc50 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
1fc60 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
1fc70 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
1fc80 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
1fc90 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
1fca0 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
1fcb0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
1fcc0 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
1fcd0 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
1fce0 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
1fcf0 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
1fd00 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
1fd10 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1fd20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1fd30 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
1fd40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1fd50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1fd60 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
1fd70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1fd80 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1fd90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fda0 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1fdb0 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  OCK );..  if( !p
1fdc0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1fdd0 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
1fde0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fdf0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1fe00 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
1fe10 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  */.    Pgno nPag
1fe20 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1fe30 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1fe40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fe50 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70  e */..    rc = p
1fe60 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1fe70 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
1fe80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1fe90 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e  rn rc;.    if( n
1fea0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
1feb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
1fec0 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
1fed0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
1fee0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1fef0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1ff00 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20  _DELETE_NOENT ) 
1ff10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ff20 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b        isWal = 0;
1ff30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ff40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ff50 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
1ff60 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20    pPager->pVfs, 
1ff70 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51  pPager->zWal, SQ
1ff80 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1ff90 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20  TS, &isWal.     
1ffa0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
1ffb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ffc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57  ){.      if( isW
1ffd0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  al ){.        te
1ffe0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50  stcase( sqlite3P
1fff0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
20000 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
20010 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
20020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
20030 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30  penWal(pPager, 0
20040 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
20050 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
20060 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
20070 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
20080 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
20090 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
200a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
200b0 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
200c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
200d0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
200e0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
200f0 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
20100 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
20110 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
20120 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
20130 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
20140 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
20150 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
20160 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
20170 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
20180 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
20190 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
201a0 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
201b0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
201c0 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
201d0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
201e0 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
201f0 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
20200 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
20210 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
20220 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
20230 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
20240 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
20250 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
20260 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
20270 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
20280 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
20290 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
202a0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
202b0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
202c0 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
202d0 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
202e0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
202f0 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
20300 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
20310 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20320 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
20330 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
20340 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
20350 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
20360 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20370 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
20380 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
20390 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
203a0 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
203b0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
203c0 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
203d0 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
203e0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
203f0 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
20400 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
20410 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
20420 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
20430 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
20440 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
20450 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
20460 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
20470 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
20480 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
20490 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
204a0 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
204b0 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
204c0 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
204d0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
204e0 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
204f0 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
20500 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
20510 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
20520 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
20530 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
20540 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
20550 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
20560 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
20570 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
20580 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
20590 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
205a0 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
205b0 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
205c0 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
205d0 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
205e0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
205f0 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
20600 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
20610 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
20620 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
20630 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
20640 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
20650 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
20660 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
20670 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
20680 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
20690 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
206a0 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
206b0 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
206c0 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
206d0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
206e0 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
206f0 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
20700 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
20710 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
20720 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
20730 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
20740 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
20750 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
20760 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
20770 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
20780 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
20790 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
207a0 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
207b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
207c0 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
207d0 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
207e0 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
207f0 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
20800 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20820 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
20830 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20840 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
20850 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
20860 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
20870 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
20880 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
20890 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
208a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
208b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
208c0 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
208d0 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
208e0 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
208f0 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
20900 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
20910 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
20920 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
20930 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
20940 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20950 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
20960 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f  R_LOCKED );..  /
20970 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
20980 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
20990 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
209a0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
209b0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
209c0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
209d0 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
209e0 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
209f0 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
20a00 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
20a10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20a20 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
20a30 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
20a40 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
20a50 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
20a60 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
20a70 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
20a80 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
20a90 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
20aa0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
20ab0 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
20ac0 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
20ad0 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
20ae0 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61  bOrigSize;.  pPa
20af0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
20b00 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
20b10 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
20b20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70  !pSavepoint && p
20b30 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20b40 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
20b50 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
20b60 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
20b70 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
20b80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
20b90 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
20ba0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
20bb0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
20bc0 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
20bd0 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
20be0 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
20bf0 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
20c00 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
20c10 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
20c20 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
20c30 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
20c40 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
20c50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
20c60 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
20c70 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
20c80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20c90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
20ca0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
20cb0 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a  =0 || szJ==0 );.
20cc0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
20cd0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
20ce0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  rds from the mai
20cf0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
20d00 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72  ng at.  ** Pager
20d10 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
20d20 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
20d30 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75   to the next jou
20d40 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a  rnal header..  *
20d50 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  * There might be
20d60 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
20d70 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61  main journal tha
20d80 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
20d90 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65  mber.  ** greate
20da0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
20db0 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  nt database size
20dc0 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
20dd0 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a  ) but those.  **
20de0 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
20df0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
20e00 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64   Pages are added
20e10 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65   to pDone as the
20e20 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65  y.  ** are playe
20e30 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d back..  */.  i
20e40 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26  f( pSavepoint &&
20e50 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
20e60 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64  ager) ){.    iHd
20e70 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  rOff = pSavepoin
20e80 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20  t->iHdrOffset ? 
20e90 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
20ea0 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20  Offset : szJ;.  
20eb0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20ec0 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  lOff = pSavepoin
20ed0 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  t->iOffset;.    
20ee0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
20ef0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
20f00 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f  journalOff<iHdrO
20f10 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ff ){.      rc =
20f20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
20f30 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
20f40 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
20f50 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
20f60 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
20f70 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
20f80 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65  _DONE );.  }else
20f90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
20fa0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
20fb0 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65  }..  /* Continue
20fc0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
20fd0 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65  cords out of the
20fe0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
20ff0 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74  arting at.  ** t
21000 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
21010 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64   header seen and
21020 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69   continuing unti
21030 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  l the effective 
21040 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  end.  ** of the 
21050 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
21060 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  e.  Continue to 
21070 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  skip out-of-rang
21080 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a  e pages and.  **
21090 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67   continue adding
210a0 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
210b0 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a  ck to pDone..  *
210c0 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
210d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
210e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
210f0 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  zJ ){.    u32 ii
21100 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21110 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21120 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
21130 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
21140 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
21150 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
21160 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
21170 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
21180 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e  ager, 0, szJ, &n
21190 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
211a0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
211b0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
211c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
211d0 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
211e0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
211f0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
21200 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
21210 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
21220 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
21230 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
21240 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
21250 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
21260 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
21270 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
21280 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
21290 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
212a0 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26  nJRec==0 .     &
212b0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
212c0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
212d0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
212e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
212f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52      ){.      nJR
21300 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20  ec = (u32)((szJ 
21310 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
21320 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  lOff)/JOURNAL_PG
21330 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
21340 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
21350 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21360 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70  && ii<nJRec && p
21370 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21380 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20  f<szJ; ii++){.  
21390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
213a0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
213b0 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
213c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
213d0 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
213e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
213f0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21400 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
21410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
21420 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21430 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a  ff>=szJ );..  /*
21440 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62   Finally,  rollb
21450 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
21460 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
21470 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a   Page that were.
21480 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
21490 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20  rolled back out 
214a0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
214b0 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e  nal (and are hen
214c0 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a  ce in pDone).  *
214d0 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
214e0 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65  d.  Out-of-range
214f0 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20   pages are also 
21500 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
21510 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
21520 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
21530 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21540 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21550 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36  i64 offset = (i6
21560 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  4)pSavepoint->iS
21570 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
21580 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
21590 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
215a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
215b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
215c0 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70  lSavepointUndo(p
215d0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61  Pager->pWal, pSa
215e0 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74  vepoint->aWalDat
215f0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  a);.    }.    fo
21600 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
21610 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
21620 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
21630 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
21640 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
21650 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34  rt( offset==(i64
21660 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  )ii*(4+pPager->p
21670 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20  ageSize) );.    
21680 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21690 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
216a0 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20  Pager, &offset, 
216b0 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20  pDone, 0, 1);.  
216c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
216d0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
216e0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
216f0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
21700 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Done);.  if( rc=
21710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21720 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21730 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  lOff = szJ;.  }.
21740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21750 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
21760 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
21770 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
21780 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
21790 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
217a0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
217b0 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
217c0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
217d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
217e0 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
217f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
21800 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
21810 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f  * Invoke SQLITE_
21820 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20  FCNTL_MMAP_SIZE 
21830 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72  based on the cur
21840 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a  rent value of sz
21850 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Mmap..*/.static 
21860 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70  void pagerFixMap
21870 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  limit(Pager *pPa
21880 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  ger){.#if SQLITE
21890 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
218a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
218b0 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64  *fd = pPager->fd
218c0 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66  ;.  if( isOpen(f
218d0 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f  d) && fd->pMetho
218e0 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20  ds->iVersion>=3 
218f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
21900 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20  nt64 sz;.    sz 
21910 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70  = pPager->szMmap
21920 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55  ;.    pPager->bU
21930 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29  seFetch = (sz>0)
21940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
21950 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
21960 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
21970 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
21980 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e  E, &sz);.  }.#en
21990 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dif.}../*.** Cha
219a0 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
219b0 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f  size of any memo
219c0 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20  ry mapping made 
219d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
219e0 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
219f0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
21a00 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  pLimit(Pager *pP
21a10 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ager, sqlite3_in
21a20 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70  t64 szMmap){.  p
21a30 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
21a40 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46  szMmap;.  pagerF
21a50 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
21a60 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
21a70 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
21a80 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
21a90 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
21aa0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21ab0 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
21ac0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
21ad0 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
21ae0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
21af0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
21b00 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20  settings of the 
21b10 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73  pager to those s
21b20 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
21b30 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  pgFlags paramete
21b40 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65  r..**.** The "le
21b50 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20  vel" in pgFlags 
21b60 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
21b70 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68  OUS_MASK sets th
21b80 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20  e robustness.** 
21b90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21ba0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
21bb0 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70   OS crashes or p
21bc0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
21bd0 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65  .** changing the
21be0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
21bf0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
21c00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   the journals..*
21c10 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  * There are thre
21c20 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
21c30 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
21c40 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
21c50 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
21c60 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
21c70 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
21c80 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
21c90 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
21ca0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
21cb0 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
21cc0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
21cd0 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
21ce0 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
21cf0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
21d00 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
21d10 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
21d20 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
21d30 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
21d40 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
21d50 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
21d60 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
21d70 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
21d80 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
21d90 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
21da0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
21db0 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
21dc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21dd0 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
21de0 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
21df0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
21e00 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
21e10 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
21e20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
21e30 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
21e40 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
21e50 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
21e60 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
21e70 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
21e80 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
21e90 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
21ea0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
21eb0 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
21ec0 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
21ed0 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
21ee0 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
21ef0 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
21f00 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
21f10 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
21f20 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
21f30 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
21f40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21f50 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
21f60 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
21f70 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
21f80 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
21f90 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
21fa0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
21fb0 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
21fc0 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
21fd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
21fe0 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
21ff0 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
22000 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
22010 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
22020 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61  e above is for a
22030 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
22040 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c  l mode.  For WAL
22050 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69   mode, OFF conti
22060 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20  nues.** to mean 
22070 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76  that no syncs ev
22080 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41  er occur.  NORMA
22090 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
220a0 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a   WAL is synced.*
220b0 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  * prior to the s
220c0 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69  tart of checkpoi
220d0 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  nt and that the 
220e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
220f0 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68   synced.** at th
22100 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
22110 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
22120 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  f the entire con
22130 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a  tent of the WAL.
22140 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62  ** was written b
22150 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
22160 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73  abase.  But no s
22170 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ync operations o
22180 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f  ccur for.** an o
22190 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69  rdinary commit i
221a0 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69  n NORMAL mode wi
221b0 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65  th WAL.  FULL me
221c0 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
221d0 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63  .** file is sync
221e0 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ed following eac
221f0 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69  h commit operati
22200 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  on, in addition 
22210 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20  to the.** syncs 
22220 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22230 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f  NORMAL..**.** Do
22240 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e   not confuse syn
22250 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69  chronous=FULL wi
22260 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  th SQLITE_SYNC_F
22270 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ULL.  The.** SQL
22280 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61  ITE_SYNC_FULL ma
22290 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65  cro means to use
222a0 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c   the MacOSX-styl
222b0 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20  e full-fsync.** 
222c0 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55  using fcntl(F_FU
222d0 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54  LLFSYNC).  SQLIT
222e0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65  E_SYNC_NORMAL me
222f0 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20  ans to do an.** 
22300 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29  ordinary fsync()
22310 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73   call.  There is
22320 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
22330 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59  etween SQLITE_SY
22340 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53  NC_FULL.** and S
22350 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22360 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f  L on platforms o
22370 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58  ther than MacOSX
22380 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79  .  But the.** sy
22390 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76  nchronous=FULL v
223a0 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75  ersus synchronou
223b0 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67  s=NORMAL setting
223c0 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e   determines when
223d0 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72  .** the xSync pr
223e0 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65  imitive is calle
223f0 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e  d and is relevan
22400 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72  t to all platfor
22410 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ms..**.** Numeri
22420 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
22430 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
22440 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
22450 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
22460 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
22470 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22480 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
22490 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
224a0 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67  rSetFlags(.  Pag
224b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
224c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
224d0 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
224e0 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73  vel for */.  uns
224f0 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
22500 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
22510 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ags */.){.  unsi
22520 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46  gned level = pgF
22530 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
22540 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20  CHRONOUS_MASK;. 
22550 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d   assert( level>=
22560 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b  1 && level<=3 );
22570 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
22580 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c  c =  (level==1 |
22590 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
225a0 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
225b0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
225c0 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
225d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
225e0 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1:0;.  if( pPage
225f0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
22600 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22610 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  gs = 0;.    pPag
22620 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
22630 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  s = 0;.  }else i
22640 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
22650 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  ER_FULLFSYNC ){.
22660 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22670 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22680 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
22690 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
226a0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
226b0 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
226c0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
226d0 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59  GER_CKPT_FULLFSY
226e0 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
226f0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
22700 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22710 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22720 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22730 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
22750 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
22760 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
22770 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
22780 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
22790 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
227a0 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
227b0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
227c0 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
227d0 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
227e0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
227f0 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
22800 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
22810 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
22820 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c  ;.  }.  if( pgFl
22830 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48  ags & PAGER_CACH
22840 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50  ESPILL ){.    pP
22850 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
22860 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f   &= ~SPILLFLAG_O
22870 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FF;.  }else{.   
22880 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
22890 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
228a0 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  _OFF;.  }.}.#end
228b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
228c0 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
228d0 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
228e0 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
228f0 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
22900 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
22910 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
22920 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
22930 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
22940 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
22950 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
22960 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
22970 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
22980 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
22990 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
229a0 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
229b0 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
229c0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
229d0 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
229e0 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
229f0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
22a00 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
22a10 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
22a20 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
22a30 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
22a40 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
22a50 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
22a60 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
22a70 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
22a80 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
22a90 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
22aa0 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
22ab0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
22ac0 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
22ad0 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
22ae0 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
22af0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
22b00 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22b10 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
22b20 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
22b30 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22b40 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
22b50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
22b60 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
22b70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
22b80 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
22b90 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22ba0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
22bb0 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
22bc0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
22bd0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22be0 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
22bf0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
22c00 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
22c10 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
22c20 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
22c30 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22c50 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
22c60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22c70 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
22c80 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
22c90 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
22ca0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
22cb0 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
22cc0 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
22cd0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
22ce0 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
22cf0 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ON.            (
22d00 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
22d10 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c  &SQLITE_OPEN_FIL
22d20 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b  EPROTECTION_MASK
22d30 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  )|.#endif.      
22d40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22d50 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
22d60 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
22d70 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
22d80 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
22d90 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
22da0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
22db0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22dc0 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
22dd0 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
22de0 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
22df0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22e00 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
22e10 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
22e20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
22e30 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
22e40 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
22e50 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
22e60 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
22e70 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
22e80 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
22e90 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
22ea0 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
22eb0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
22ec0 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
22ed0 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
22ee0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
22ef0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
22f00 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
22f10 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
22f20 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
22f30 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
22f40 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
22f50 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
22f60 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
22f70 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
22f80 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
22f90 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
22fa0 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
22fb0 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
22fc0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
22fd0 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
22fe0 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
23010 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
23020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23050 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
23060 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
23070 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
23080 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
23090 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
230a0 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
230b0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
230c0 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
230d0 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
230e0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
230f0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
23100 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
23110 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
23120 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
23130 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
23140 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
23150 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
23160 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
23170 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
23180 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
23190 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
231a0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
231b0 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
231c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
231d0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
231e0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
231f0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
23200 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
23210 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
23220 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
23230 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
23240 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
23250 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
23260 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
23270 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
23280 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
23290 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
232a0 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
232b0 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  dler */.){.  pPa
232c0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
232d0 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
232e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
232f0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
23300 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a  usyHandlerArg;..
23310 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
23320 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
23330 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69  void **ap = (voi
23340 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42  d **)&pPager->xB
23350 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
23360 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29  assert( ((int(*)
23370 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29  (void *))(ap[0])
23380 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20  )==xBusyHandler 
23390 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
233a0 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c  p[1]==pBusyHandl
233b0 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c  erArg );.    sql
233c0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
233d0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
233e0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42  , SQLITE_FCNTL_B
233f0 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69  USYHANDLER, (voi
23400 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  d *)ap);.  }.}..
23410 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
23420 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
23430 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
23440 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
23450 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
23460 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
23470 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
23480 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
23490 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
234a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
234b0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
234c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
234d0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
234e0 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
234f0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
23500 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
23510 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20  QLITE_IOERR, an 
23520 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78  SQLITE_IOERR_xxx
23530 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c   sub-code or SQL
23540 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
23550 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
23560 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
23570 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
23580 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
23590 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
235a0 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
235b0 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
235c0 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
235d0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
235e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
235f0 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
23600 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
23610 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
23620 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
23630 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
23640 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
23650 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
23660 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
23670 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
23680 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
23690 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
236a0 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
236b0 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
236c0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
236d0 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
236e0 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
236f0 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
23700 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
23710 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
23720 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
23730 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
23740 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
23750 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
23760 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
23770 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
23780 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
23790 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
237a0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
237b0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
237c0 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
237d0 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
237e0 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
237f0 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
23800 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
23810 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
23820 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
23830 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
23840 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
23850 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
23860 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
23870 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
23880 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
23890 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
238a0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
238b0 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
238c0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
238d0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
238e0 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
238f0 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
23900 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
23910 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
23920 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
23930 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
23940 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
23950 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
23960 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50  *pPager, u32 *pP
23970 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
23980 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
23990 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
239a0 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
239b0 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66  ssible to do a f
239c0 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72  ull assert_pager
239d0 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61  _state() here, a
239e0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
239f0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
23a00 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50  ed from within P
23a10 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f  agerOpen(), befo
23a20 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  re the state.  *
23a30 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  * of the Pager o
23a40 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61  bject is interna
23a50 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a  lly consistent..
23a60 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65    **.  ** At one
23a70 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63   point this func
23a80 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e  tion returned an
23a90 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61   error if the pa
23aa0 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a  ger was in .  **
23ab0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
23ac0 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41  te. But since PA
23ad0 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20  GER_ERROR state 
23ae0 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
23af0 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74    ** there is at
23b00 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
23b10 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
23b20 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63  rence, this func
23b30 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e  tion.  ** is a n
23b40 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61  o-op for that ca
23b50 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a  se anyhow..  */.
23b60 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20  .  u32 pageSize 
23b70 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
23b80 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
23b90 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
23ba0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
23bb0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
23bc0 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66  GE_SIZE) );.  if
23bd0 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( (pPager->memDb
23be0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
23bf0 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20  bSize==0).   && 
23c00 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
23c10 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
23c20 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26  Cache)==0 .   &&
23c30 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
23c40 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67  eSize!=(u32)pPag
23c50 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
23c60 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
23c70 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  w = NULL;       
23c80 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d        /* New tem
23c90 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  p space */.    i
23ca0 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20  64 nByte = 0;.. 
23cb0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
23cc0 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
23cd0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
23ce0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
23cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
23d00 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
23d10 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
23d20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
23d30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23d40 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29   pNew = (char *)
23d50 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
23d60 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
23d70 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72     if( !pNew ) r
23d80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23d90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
23da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23db0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
23dc0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
23dd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
23de0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
23df0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
23e00 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
23e10 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 72 63 20   pNew;.      rc 
23e20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
23e30 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
23e40 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
23e50 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
23e60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23e70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
23e80 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67  er->dbSize = (Pg
23e90 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53  no)((nByte+pageS
23ea0 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29  ize-1)/pageSize)
23eb0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
23ec0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
23ed0 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ize;.    }.  }..
23ee0 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
23ef0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
23f00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23f10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
23f20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
23f30 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
23f40 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
23f50 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
23f60 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
23f70 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
23f80 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
23f90 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
23fa0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
23fb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67  pPager);.    pag
23fc0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
23fd0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
23fe0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23ff0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
24000 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
24010 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
24020 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
24030 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
24040 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
24050 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
24060 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
24070 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
24080 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
24090 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
240a0 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
240b0 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
240c0 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
240d0 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
240e0 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
240f0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
24100 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
24110 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
24120 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
24130 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
24140 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
24150 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
24160 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
24170 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
24180 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
24190 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
241a0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
241b0 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
241c0 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
241d0 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
241e0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
241f0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
24200 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
24210 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
24220 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
24230 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
24240 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
24250 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
24260 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
24270 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
24280 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
24290 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
242a0 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
242b0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
242c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
242d0 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
242e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
242f0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
24300 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
24310 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
24320 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
24330 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24340 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
24350 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
24360 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
24370 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
24380 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
24390 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
243a0 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
243b0 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
243c0 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
243d0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
243e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
243f0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
24400 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24410 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
24420 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
24430 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
24440 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
24450 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
24460 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
24470 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
24480 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
24490 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
244a0 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
244b0 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
244c0 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
244d0 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
244e0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
244f0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
24500 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
24510 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
24520 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24530 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
24540 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
24550 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
24560 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
24570 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
24580 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24590 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
245a0 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
245b0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
245c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
245d0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
245e0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
245f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
24600 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
24610 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24620 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
24630 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
24640 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
24650 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24660 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
24670 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24680 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
24690 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
246a0 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
246b0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
246c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
246d0 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
246e0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
246f0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
24700 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
24710 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
24720 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
24730 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
24740 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
24750 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
24760 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
24770 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
24780 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
24790 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
247a0 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
247b0 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
247c0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
247d0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
247e0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
247f0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
24800 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
24810 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
24820 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
24830 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
24840 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
24850 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
24860 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
24870 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
24880 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
24890 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
248a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
248b0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
248c0 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
248d0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
248e0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
248f0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
24900 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
24910 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
24920 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
24930 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
24940 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
24950 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
24960 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
24970 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
24980 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24990 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
249a0 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
249b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
249c0 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
249d0 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
249e0 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
249f0 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
24a00 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
24a10 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
24a20 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
24a30 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
24a40 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
24a50 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
24a60 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
24a70 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
24a80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
24a90 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
24aa0 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
24ab0 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
24ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
24ad0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
24ae0 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
24af0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24b00 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
24b10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
24b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
24b30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
24b50 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
24b60 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
24b70 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
24b80 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
24b90 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
24ba0 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
24bb0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
24bc0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24bd0 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
24be0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
24bf0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
24c00 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
24c10 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
24c20 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
24c30 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
24c40 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
24c50 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
24c60 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
24c70 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
24c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24c90 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
24ca0 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
24cb0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24cc0 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
24cd0 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
24ce0 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
24cf0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
24d00 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
24d10 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
24d20 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
24d30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24d40 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
24d50 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
24d60 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
24d70 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
24d80 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
24d90 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
24da0 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
24db0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
24dc0 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
24dd0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
24de0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
24df0 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
24e00 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
24e10 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
24e20 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
24e30 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
24e40 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
24e50 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
24e60 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
24e70 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
24e80 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
24e90 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
24ea0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
24eb0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
24ec0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
24ed0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
24ee0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
24ef0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
24f00 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
24f10 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
24f20 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
24f30 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
24f40 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
24f50 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
24f60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
24f70 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
24f80 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24f90 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
24fa0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fc0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
24fd0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
24fe0 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
24ff0 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
25000 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
25010 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
25020 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20   already held), 
25030 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72  or one of the tr
25040 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74  ansitions that t
25050 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
25060 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
25070 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
25080 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
25090 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
250a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
250b0 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
250c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
250d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
250e0 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
250f0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
25100 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
25110 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
25120 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
25130 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
25140 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
25150 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
25160 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
25170 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
25180 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
25190 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
251a0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
251b0 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
251c0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
251d0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
251e0 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
251f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25200 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
25210 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25220 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
25230 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
25240 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
25250 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
25260 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
25270 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
25280 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
25290 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
252a0 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
252b0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
252c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
252d0 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
252e0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
252f0 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
25300 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
25310 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
25320 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
25330 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
25340 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
25350 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
25360 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
25370 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
25380 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
25390 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
253a0 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
253b0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
253c0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
253d0 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
253e0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
253f0 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
25400 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
25410 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
25420 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
25430 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
25440 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
25450 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
25460 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
25470 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
25480 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
25490 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
254a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
254b0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
254c0 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
254d0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
254e0 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
254f0 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
25500 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65  ehavior would be
25510 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
25520 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
25530 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
25540 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
25550 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
25560 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
25570 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
25580 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
25590 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
255a0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
255b0 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
255c0 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
255d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
255e0 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
255f0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
25600 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
25610 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
25620 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
25630 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
25640 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
25650 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
25660 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
25670 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
25680 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
25690 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
256a0 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
256b0 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
256c0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
256d0 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
256e0 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
256f0 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
25700 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
25710 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
25720 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
25730 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25740 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
25750 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
25760 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
25770 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
25780 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
25790 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
257a0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
257b0 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
257c0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
257d0 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
257e0 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
257f0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
25800 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
25810 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
25820 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
25830 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
25840 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
25850 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
25860 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
25870 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
25880 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
25890 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
258a0 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
258b0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
258c0 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
258d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
258e0 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
258f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25900 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
25910 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
25920 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
25930 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20  action..** Once 
25940 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
25950 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  s been called, t
25960 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  he transaction m
25970 75 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a  ust either be.**
25980 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20   rolled back or 
25990 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73  committed. It is
259a0 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c   not safe to cal
259b0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
259c0 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74  and.** then cont
259d0 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20  inue writing to 
259e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
259f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
25a00 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
25a10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
25a20 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
25a30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
25a40 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
25a50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25a60 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
25a70 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
25a80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
25a90 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f  ze = nPage;..  /
25aa0 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
25ab0 68 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c  he code here cal
25ac0 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  led assertTrunca
25ad0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74  teConstraint() t
25ae0 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68  o.  ** ensure th
25af0 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69  at all pages bei
25b00 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61  ng truncated awa
25b10 79 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  y by this operat
25b20 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66  ion are,.  ** if
25b30 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
25b40 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e  epoints are open
25b50 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  , present in the
25b60 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
25b70 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74   journal so that
25b80 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73   they can be res
25b90 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76  tored if the sav
25ba0 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64  epoint is rolled
25bb0 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73  .  ** back. This
25bc0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65   is no longer ne
25bd0 63 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20  cessary as this 
25be0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
25bf0 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64  only.  ** called
25c00 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f   right before co
25c10 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
25c20 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f  action. So altho
25c30 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ugh the .  ** Pa
25c40 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73  ger object may s
25c50 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73  till have open s
25c60 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72  avepoints (Pager
25c70 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c  .nSavepoint!=0),
25c80 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e   .  ** they cann
25c90 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
25ca0 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74  k. So the assert
25cb0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25cc0 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69  nt() call.  ** i
25cd0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72  s no longer corr
25ce0 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a  ect. */.}.../*.*
25cf0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25d00 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
25d10 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f   attempting a ho
25d20 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
25d30 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20  ck. It.** syncs 
25d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25d50 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73   to disk, then s
25d60 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ets pPager->jour
25d70 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a  nalHdr to the.**
25d80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
25d90 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61  rnal file so tha
25da0 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  t the pager_play
25db0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b  back() routine k
25dc0 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  nows.** that the
25dd0 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
25de0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
25df0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63  nced..**.** Sync
25e00 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
25e10 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65  l to disk before
25e20 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
25e30 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75  oll it back ensu
25e40 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20  res .** that if 
25e50 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  a power-failure 
25e60 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
25e70 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  e rollback, the 
25e80 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20  process that.** 
25e90 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63  attempts rollbac
25ea0 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74  k following syst
25eb0 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73  em recovery sees
25ec0 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61   the same journa
25ed0 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20  l.** content as 
25ee0 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  this process..**
25ef0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
25f00 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65  g goes as planne
25f10 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
25f20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
25f30 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69  ise, .** an SQLi
25f40 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
25f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
25f60 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
25f70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25f80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25f90 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
25fa0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
25fb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25fc0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
25fd0 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
25fe0 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69  NORMAL);.  }.  i
25ff0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26000 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
26010 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
26020 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
26030 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
26040 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26050 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  c;.}../*.** Obta
26060 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
26070 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  o a memory mappe
26080 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f  d page object fo
26090 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  r page number pg
260a0 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20  no. .** The new 
260b0 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20  object will use 
260c0 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74  the pointer pDat
260d0 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  a, obtained from
260e0 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66   xFetch()..** If
260f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
26100 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e   *ppPage to poin
26110 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
26120 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61  e reference.** a
26130 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
26140 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
26150 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
26160 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
26170 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74  set.** *ppPage t
26180 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61  o zero..**.** Pa
26190 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62  ge references ob
261a0 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
261b0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
261c0 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73  should be releas
261d0 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67  ed.** by calling
261e0 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
261f0 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
26200 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
26210 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67  reMapPage(.  Pag
26220 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26240 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
26250 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26270 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
26280 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74   */.  void *pDat
26290 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
262a0 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28        /* xFetch(
262b0 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69  )'d data for thi
262c0 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
262d0 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20  r **ppPage      
262e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
262f0 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67  UT: Acquired pag
26300 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
26310 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26330 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
26340 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e  d page to return
26350 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
26360 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26370 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
26380 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  = p = pPager->pM
26390 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20  mapFreelist;.   
263a0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
263b0 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72  eelist = p->pDir
263c0 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
263d0 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65  y = 0;.    memse
263e0 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  t(p->pExtra, 0, 
263f0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
26400 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
26410 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48  pPage = p = (PgH
26420 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  dr *)sqlite3Mall
26430 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
26440 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Hdr) + pPager->n
26450 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20  Extra);.    if( 
26460 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
26470 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
26480 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
26490 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
264a0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
264b0 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
264c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
264d0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
264e0 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
264f0 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
26500 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
26510 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
26520 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
26530 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
26540 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
26550 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
26560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26570 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
26580 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
26590 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
265a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
265b0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
265c0 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
265d0 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
265e0 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
265f0 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
26600 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
26610 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
26620 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26630 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
26640 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67  ence to page pPg
26650 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20  . pPg must have 
26660 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79  been returned by
26670 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20   an .** earlier 
26680 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71  call to pagerAcq
26690 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  uireMapPage()..*
266a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
266b0 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
266c0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
266d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
266e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
266f0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26700 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
26710 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  y = pPager->pMma
26720 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61  pFreelist;.  pPa
26730 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26740 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73  st = pPg;..  ass
26750 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
26760 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
26770 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69  ion>=3 );.  sqli
26780 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
26790 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
267a0 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67  Pg->pgno-1)*pPag
267b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
267c0 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  g->pData);.}../*
267d0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48  .** Free all PgH
267e0 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65  dr objects store
267f0 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70  d in the Pager.p
26800 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73  MmapFreelist lis
26810 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
26820 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64  d pagerFreeMapHd
26830 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  rs(Pager *pPager
26840 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
26850 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
26860 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
26870 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b  MmapFreelist; p;
26880 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
26890 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  Next = p->pDirty
268a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
268b0 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(p);.  }.}.../
268c0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
268d0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
268e0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
268f0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
26900 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
26910 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
26920 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
26930 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
26940 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
26950 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
26960 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
26970 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
26980 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
26990 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
269a0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
269b0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
269c0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
269d0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
269e0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
269f0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
26a00 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
26a10 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
26a20 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
26a30 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
26a40 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
26a50 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
26a60 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
26a70 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
26a80 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
26a90 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
26aa0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
26ab0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
26ac0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
26ad0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
26ae0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
26af0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
26b00 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
26b10 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
26b20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
26b30 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
26b40 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
26b50 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
26b60 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
26b70 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
26b80 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
26b90 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
26ba0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
26bb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
26bc0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
26bd0 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
26be0 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
26bf0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26c00 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
26c10 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
26c20 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
26c30 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
26c40 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
26c50 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
26c60 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
26c70 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
26c80 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20  eSize, pTmp);.  
26c90 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
26ca0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
26cb0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
26cc0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
26cd0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
26ce0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
26cf0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
26d00 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
26d10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
26d20 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
26d30 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
26d40 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
26d50 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
26d60 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
26d70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
26d80 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
26d90 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
26da0 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
26db0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
26dc0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
26dd0 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
26de0 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
26df0 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
26e00 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
26e10 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
26e20 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
26e30 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
26e40 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
26e50 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
26e60 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
26e70 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
26e80 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
26e90 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
26ea0 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
26eb0 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
26ec0 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
26ed0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26ee0 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
26ef0 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
26f00 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
26f10 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
26f20 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
26f30 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
26f40 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
26f50 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
26f60 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
26f70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26f80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26f90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
26fa0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
26fb0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
26fc0 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
26fd0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
26fe0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
26ff0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
27000 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
27010 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
27020 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
27030 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
27040 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
27050 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
27060 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
27070 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
27080 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
27090 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
270a0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
270b0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
270c0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
270d0 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
270e0 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
270f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27100 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
27110 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
27120 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
27130 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
27140 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
27150 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
27160 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
27170 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
27180 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
27190 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
271a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
271b0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
271c0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
271d0 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
271e0 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
271f0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
27200 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
27210 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
27220 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
27230 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
27240 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
27250 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
27260 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
27270 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
27280 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
27290 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
272a0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
272b0 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
272c0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
272d0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
272e0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
272f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
27300 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
27310 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
27320 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
27330 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
27340 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
27350 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
27360 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
27370 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
27380 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
27390 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
273a0 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
273b0 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
273c0 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
273d0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
273e0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
273f0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
27400 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
27410 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
27420 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
27430 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27440 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27450 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
27460 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
27470 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
27480 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
27490 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
274a0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
274b0 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
274c0 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
274d0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
274e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
274f0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
27500 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
27510 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
27520 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
27530 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
27540 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
27550 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27560 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
27570 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
27580 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
27590 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
275a0 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
275b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
275c0 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
275d0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
275e0 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
275f0 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
27600 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
27610 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
27620 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
27630 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
27640 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
27650 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
27660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27670 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
27680 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
27690 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
276a0 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
276b0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
276c0 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
276d0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
276e0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
276f0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
27700 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
27710 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
27720 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
27730 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
27740 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
27750 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
27760 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
27770 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
27780 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
27790 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
277a0 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
277b0 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
277c0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
277d0 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
277e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
277f0 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
27800 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
27810 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
27820 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
27830 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
27840 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
27850 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
27860 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
27870 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
27880 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
27890 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
278a0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
278b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
278c0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
278d0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
278e0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
278f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
27900 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
27910 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27930 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
27940 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27950 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
27960 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
27970 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
27980 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
27990 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
279a0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
279b0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
279c0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
279d0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
279e0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
279f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
27a00 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
27a10 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
27a20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
27a30 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
27a40 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
27a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
27a60 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
27a70 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
27a80 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
27a90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27aa0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
27ab0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
27ac0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
27ad0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
27ae0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
27af0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
27b00 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
27b10 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27b20 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
27b30 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
27b40 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
27b50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
27b60 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
27b70 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
27b80 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
27b90 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
27ba0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
27bb0 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
27bc0 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
27bd0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
27be0 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
27bf0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
27c00 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
27c10 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
27c20 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
27c30 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
27c40 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
27c50 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
27c60 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
27c70 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
27c80 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
27c90 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
27ca0 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
27cb0 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
27cc0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
27cd0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
27ce0 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
27cf0 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
27d00 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
27d10 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
27d20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
27d30 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
27d40 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
27d50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
27d60 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
27d70 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
27d80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27d90 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
27da0 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
27db0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
27dc0 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
27dd0 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
27de0 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
27df0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
27e00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
27e10 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
27e20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
27e30 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
27e40 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
27e50 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
27e60 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
27e70 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
27e80 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
27e90 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
27ea0 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
27eb0 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
27ec0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
27ed0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
27ee0 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
27ef0 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
27f00 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
27f10 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
27f20 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
27f30 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
27f40 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
27f50 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
27f60 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
27f70 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
27f80 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
27f90 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
27fa0 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
27fb0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
27fc0 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
27fd0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
27fe0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
27ff0 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
28000 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
28010 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
28020 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
28030 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
28040 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
28050 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
28060 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
28070 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
28080 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
28090 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
280a0 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
280b0 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
280c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
280d0 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
280e0 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
280f0 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
28100 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
28110 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
28120 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
28130 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
28140 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
28150 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
28160 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
28170 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
28180 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
28190 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
281a0 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
281b0 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
281c0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
281d0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
281e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
281f0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
28200 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
28210 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
28220 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
28230 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
28240 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
28250 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
28260 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
28270 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
28280 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
28290 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
282a0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
282b0 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
282c0 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
282d0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
282e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
282f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
28300 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
28310 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
28320 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
28330 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
28340 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
28350 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
28360 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28370 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
28380 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
28390 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
283a0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
283b0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
283c0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
283d0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
283e0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
283f0 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
28400 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
28410 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
28420 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
28430 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
28440 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
28450 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
28460 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
28470 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
28480 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
28490 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
284a0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
284b0 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
284c0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
284d0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
284e0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
284f0 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
28500 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
28510 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
28520 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
28530 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
28540 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
28550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
28560 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
28570 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
28580 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
28590 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
285a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
285b0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
285c0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
285d0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
285e0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
285f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
28600 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
28610 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28620 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
28630 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28640 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
28650 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
28660 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
28670 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
28680 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
28690 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
286a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
286b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
286c0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
286d0 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
286e0 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
286f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
28700 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
28710 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
28720 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
28730 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
28740 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
28750 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
28760 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
28770 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
287a0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
287b0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
287c0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
287d0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
287e0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
287f0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
28800 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
28810 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
28820 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
28830 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
28840 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
28850 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
28860 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28870 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
28880 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
28890 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
288a0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
288b0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
288c0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
288d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
288e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
288f0 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
28900 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
28910 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28920 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
28930 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
28940 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
28950 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
28960 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
28970 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
28980 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
28990 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
289a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
289b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
289c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
289d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
289e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
289f0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
28a00 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
28a10 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
28a20 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
28a30 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
28a40 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
28a50 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
28a60 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
28a70 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
28a80 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
28a90 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
28aa0 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
28ab0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
28ac0 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
28ad0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
28ae0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
28af0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
28b00 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
28b10 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
28b20 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
28b30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
28b40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
28b50 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
28b60 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
28b70 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
28b80 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
28b90 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
28ba0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
28bb0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
28bc0 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
28bd0 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
28be0 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
28bf0 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
28c00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
28c10 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
28c20 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
28c30 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
28c40 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
28c50 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
28c60 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
28c70 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
28c80 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
28c90 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
28ca0 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
28cb0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
28cc0 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
28cd0 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
28ce0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28cf0 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
28d00 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
28d10 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
28d20 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
28d30 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
28d40 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
28d50 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
28d60 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
28d70 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
28d80 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
28d90 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
28da0 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
28db0 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
28dc0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
28dd0 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
28de0 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
28df0 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
28e00 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
28e10 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
28e20 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
28e30 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
28e40 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
28e50 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
28e60 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
28e70 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
28e80 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
28e90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
28ea0 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
28eb0 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
28ec0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
28ed0 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
28ee0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
28ef0 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
28f00 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
28f10 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
28f20 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
28f30 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
28f40 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
28f50 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
28f60 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
28f70 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
28f80 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
28f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
28fa0 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
28fb0 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
28fc0 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
28fd0 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
28fe0 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
28ff0 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
29000 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
29010 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
29020 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
29030 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
29040 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
29050 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
29060 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
29070 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
29080 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29090 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
290a0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
290b0 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
290c0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
290d0 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
290e0 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
290f0 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
29100 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
29110 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
29120 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
29130 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
29140 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
29150 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
29160 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29180 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29190 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
291a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
291b0 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
291c0 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
291d0 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
291e0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
291f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
29200 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
29210 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
29220 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
29230 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
29240 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
29250 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
29260 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
29270 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
29280 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
29290 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
292a0 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
292b0 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
292c0 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
292d0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
292e0 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
292f0 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
29300 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
29310 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
29320 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
29330 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
29340 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
29350 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
29360 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
29370 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
29380 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
29390 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
293a0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
293b0 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
293c0 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
293d0 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
293e0 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
293f0 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
29400 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
29410 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
29420 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
29430 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
29440 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
29450 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
29460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29470 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64  .   && pPager->d
29480 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72  bHintSize<pPager
29490 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28  ->dbSize.   && (
294a0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c  pList->pDirty ||
294b0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
294c0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29  ger->dbHintSize)
294d0 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
294e0 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
294f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
29500 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
29510 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
29520 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
29530 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
29540 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
29550 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
29560 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
29570 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
29580 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
29590 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
295a0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
295b0 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
295c0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
295d0 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
295e0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
295f0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
29600 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
29610 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
29620 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
29630 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
29640 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
29650 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
29660 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
29670 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
29680 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
29690 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
296a0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
296b0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
296c0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
296d0 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
296e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
296f0 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
29700 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
29710 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
29720 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
29730 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
29740 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
29750 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
29760 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
29770 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
29780 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
29790 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
297a0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
297b0 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
297c0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
297d0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
297e0 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
297f0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
29800 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
29810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29830 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
29840 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
29850 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
29860 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
29870 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
29880 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
29890 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
298a0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
298b0 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
298c0 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
298d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
298e0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
298f0 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
29900 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
29910 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
29920 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
29930 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
29940 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
29950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
29960 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
29970 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
29980 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
29990 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
299a0 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
299b0 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
299c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
299d0 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
299e0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
299f0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
29a00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
29a10 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
29a20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
29a30 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
29a40 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
29a50 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
29a60 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
29a70 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
29a80 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
29a90 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
29aa0 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
29ab0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
29ac0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
29ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29ae0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
29af0 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
29b00 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
29b10 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
29b20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
29b30 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
29b40 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a  STAT_WRITE]++;..
29b50 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
29b60 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
29b70 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
29b80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
29b90 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
29ba0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
29bb0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
29bc0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
29bd0 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
29be0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
29bf0 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
29c00 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
29c10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29c20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
29c30 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
29c40 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
29c50 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
29c60 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
29c70 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
29c80 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
29c90 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
29ca0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
29cb0 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nt);.    }else{.
29cc0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
29cd0 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  (("NOSTORE %d pa
29ce0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
29cf0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
29d00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
29d10 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
29d20 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  pList);.    pLis
29d30 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
29d40 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
29d50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
29d60 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75  sure that the su
29d70 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  b-journal file i
29d80 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73  s open. If it is
29d90 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
29da0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
29db0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
29dc0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
29dd0 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
29de0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
29df0 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41  rding to plan. A
29e00 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  n .** SQLITE_IOE
29e10 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
29e20 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
29e30 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
29e40 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66  e3OsOpen() .** f
29e50 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
29e60 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
29e70 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
29e80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
29e90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
29ea0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
29eb0 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
29ec0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
29ed0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
29ee0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c  ALMODE_MEMORY ||
29ef0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
29f00 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73  emory ){.      s
29f10 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
29f20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
29f30 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
29f40 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f       rc = pagerO
29f50 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
29f60 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51  pPager->sjfd, SQ
29f70 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
29f80 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  RNAL);.    }.  }
29f90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29fa0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
29fb0 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
29fc0 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
29fd0 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
29fe0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20  ub-journal. .** 
29ff0 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  It is the caller
2a000 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
2a010 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75   to use subjRequ
2a020 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68  iresPage() to ch
2a030 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20  eck .** that it 
2a040 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  is really requir
2a050 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
2a060 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
2a070 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2a080 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69  sful, set the bi
2a090 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
2a0a0 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  to pPg->pgno in 
2a0b0 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66  the bitvecs.** f
2a0c0 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  or all open save
2a0d0 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65  points before re
2a0e0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
2a0f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2a100 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
2a110 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2a120 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49  successful, an I
2a130 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  O.** error code 
2a140 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
2a150 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73  o write to the s
2a160 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  ub-journal fails
2a170 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  , or .** SQLITE_
2a180 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
2a190 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65  c fails while se
2a1a0 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61  tting a bit in a
2a1b0 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69   savepoint.** bi
2a1c0 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tvec..*/.static 
2a1d0 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
2a1e0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
2a1f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a200 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
2a210 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2a220 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ger;.  if( pPage
2a230 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2a240 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2a250 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a  E_OFF ){..    /*
2a260 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
2a270 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73  urnal, if it has
2a280 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
2a290 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  n opened */.    
2a2a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a2b0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2a2c0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2a2d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
2a2e0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2a2f0 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ger) );.    asse
2a300 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2a310 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67  r->sjfd) || pPag
2a320 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29  er->nSubRec==0 )
2a330 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
2a340 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a350 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2a360 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61  ageInJournal(pPa
2a370 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20  ger, pPg) .     
2a380 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
2a390 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
2a3a0 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
2a3b0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
2a3c0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
2a3d0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
2a3e0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
2a3f0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
2a400 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
2a410 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
2a420 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
2a430 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
2a440 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
2a450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a460 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
2a470 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
2a480 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
2a490 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65  set = (i64)pPage
2a4a0 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
2a4b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2a4c0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
2a4d0 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
2a4e0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
2a4f0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
2a500 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2a510 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
2a520 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2a530 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
2a540 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2a550 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2a560 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2a570 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2a580 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
2a590 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
2a5a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2a5b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a5c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2a5d0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2a5e0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
2a5f0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2a600 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
2a610 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a620 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2a630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
2a640 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
2a650 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a660 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
2a670 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
2a680 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2a690 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
2a6a0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2a6b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a6c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2a6d0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2a6e0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2a6f0 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2a700 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2a710 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2a720 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2a730 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2a740 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2a750 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2a760 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2a770 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2a780 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2a790 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2a7a0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2a7b0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2a7c0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2a7d0 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2a7e0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2a7f0 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2a800 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2a810 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2a820 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2a830 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2a840 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2a850 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2a860 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2a870 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2a880 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2a890 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2a8a0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2a8b0 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2a8c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a8d0 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2a8e0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2a8f0 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2a900 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2a910 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2a920 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2a930 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2a940 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2a950 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2a960 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2a970 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2a980 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2a990 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2a9a0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2a9b0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2a9c0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2a9d0 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2a9e0 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2a9f0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2aa00 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2aa10 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2aa20 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2aa30 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2aa40 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2aa50 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2aa60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2aa70 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2aa80 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2aa90 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2aaa0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2aab0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2aac0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2aad0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2aae0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2aaf0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2ab00 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2ab10 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  /* The doNotSpil
2ab20 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20  l NOSYNC bit is 
2ab30 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
2ab40 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
2ab50 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
2ab60 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
2ab70 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
2ab80 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
2ab90 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
2aba0 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
2abb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2abc0 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
2abd0 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
2abe0 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
2abf0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
2ac00 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
2ac10 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
2ac20 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61  Spill ROLLBACK a
2ac30 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69  nd OFF bits inhi
2ac40 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2ac50 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67  pilling.  ** reg
2ac60 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2ac70 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  er or not a sync
2ac80 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2ac90 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2aca0 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63  g.  ** a rollbac
2acb0 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71  k or by user req
2acc0 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65  uest, respective
2acd0 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ly..  **.  ** Sp
2ace0 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2acf0 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2ad00 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2ad10 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2ad20 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2ad30 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2ad40 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2ad50 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2ad60 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ion it .  ** is 
2ad70 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2ad80 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2ad90 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2ada0 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2adb0 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==3.  ** while i
2adc0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2add0 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2ade0 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2adf0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2ae00 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2ae10 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2ae20 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2ae30 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2ae40 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2ae50 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2ae60 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2ae70 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2ae80 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2ae90 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2aea0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2aeb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2aec0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2aed0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2aee0 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2aef0 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2af00 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2af10 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2af20 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2af30 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2af40 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2af50 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2af60 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2af70 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2af80 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2af90 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2afa0 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2afb0 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2afc0 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2afd0 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2afe0 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2aff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b000 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2b010 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2b020 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2b030 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2b040 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2b050 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2b060 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2b070 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
2b080 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2b090 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62   .      rc = sub
2b0a0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2b0b0 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ; .    }.    if(
2b0c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b0d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2b0e0 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2b0f0 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2b100 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b110 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2b120 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b130 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2b140 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2b150 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2b160 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2b170 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2b180 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2b190 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2b1a0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2b1b0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2b1c0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2b1d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2b1e0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
2b1f0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
2b200 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
2b210 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
2b220 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
2b230 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
2b240 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
2b250 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68  urnal..    ** Th
2b260 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
2b270 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
2b280 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
2b290 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
2b2a0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
2b2b0 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68  write data to th
2b2c0 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  e file in this c
2b2d0 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ase..    **.    
2b2e0 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
2b2f0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
2b300 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
2b310 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45    **.    **   BE
2b320 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  GIN;.    **     
2b330 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
2b340 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  .    **     <mod
2b350 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20  ify page X>.    
2b360 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
2b370 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20   sp;.    **     
2b380 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61    <shrink databa
2b390 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67  se file to Y pag
2b3a0 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  es>.    **      
2b3b0 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67   pagerStress(pag
2b3c0 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X).    **     
2b3d0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
2b3e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
2b3f0 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
2b400 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
2b410 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
2b420 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
2b430 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f  en.    ** out to
2b440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b450 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
2b460 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
2b470 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
2b480 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
2b490 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
2b4a0 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
2b4b0 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
2b4c0 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64  ll read.    ** d
2b4d0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
2b4e0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
2b4f0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
2b500 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
2b510 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65  t.    ** was whe
2b520 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
2b530 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61  n started, not a
2b540 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53  s it was when "S
2b550 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20  AVEPOINT sp".   
2b560 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64   ** was executed
2b570 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b580 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
2b590 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
2b5a0 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61  rent data for pa
2b5b0 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20  ge X into the . 
2b5c0 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61     ** sub-journa
2b5d0 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
2b5e0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2b5f0 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
2b600 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   it will.    ** 
2b610 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
2b620 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
2b630 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
2b640 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
2b650 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a     ** executed..
2b660 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e      */.    if( N
2b670 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63  EVER(.        rc
2b680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2b690 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2b6a0 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52  >dbSize && subjR
2b6b0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
2b6c0 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20  .    ) ){.      
2b6d0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2b6e0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
2b6f0 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
2b700 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2b710 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
2b720 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b730 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
2b740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b750 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
2b760 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2b770 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2b780 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b790 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2b7a0 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20  pPager, pPg);.  
2b7b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
2b7c0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
2b7d0 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
2b7e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b7f0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b800 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
2b810 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2b820 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2b830 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
2b840 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2b850 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
2b860 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
2b870 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a  pPager, rc); .}.
2b880 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2b890 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2b8a0 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
2b8b0 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
2b8c0 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
2b8d0 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
2b8e0 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
2b8f0 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
2b900 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
2b910 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2b920 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
2b930 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
2b940 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
2b950 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
2b960 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
2b970 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
2b980 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
2b990 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
2b9a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2b9b0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
2b9c0 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
2b9d0 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
2b9e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
2b9f0 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
2ba00 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
2ba10 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
2ba20 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
2ba30 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
2ba40 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
2ba50 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
2ba60 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
2ba70 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
2ba80 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
2ba90 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
2baa0 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
2bab0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
2bac0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
2bad0 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
2bae0 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
2baf0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2bb00 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
2bb10 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
2bb20 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
2bb30 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
2bb40 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2bb50 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
2bb60 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2bb70 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
2bb80 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
2bb90 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
2bba0 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
2bbb0 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
2bbc0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
2bbd0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
2bbe0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
2bbf0 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
2bc00 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
2bc10 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  he PAGER_* flags
2bc20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
2bc30 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
2bc40 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
2bc50 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
2bc60 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
2bc70 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
2bc80 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
2bc90 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
2bca0 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
2bcb0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
2bcc0 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
2bcd0 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
2bce0 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
2bcf0 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
2bd00 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
2bd10 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2bd20 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
2bd30 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
2bd40 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
2bd50 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2bd60 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
2bd70 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
2bd80 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
2bd90 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
2bda0 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
2bdb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
2bdc0 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
2bdd0 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
2bde0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
2bdf0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
2be00 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
2be10 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
2be20 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2be30 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
2be40 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2be50 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
2be60 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
2be70 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
2be80 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
2be90 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2bea0 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
2beb0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2bec0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2bed0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
2bee0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2bef0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2bf00 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
2bf10 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
2bf20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
2bf30 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
2bf40 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2bf50 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2bf70 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
2bf80 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2bf90 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
2bfa0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2bfb0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
2bfc0 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
2bfd0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
2bfe0 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
2bff0 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
2c000 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
2c010 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
2c020 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
2c030 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
2c040 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
2c050 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
2c060 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2c070 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c080 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
2c090 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2c0a0 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
2c0b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2c0c0 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
2c0d0 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
2c0e0 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
2c0f0 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
2c100 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2c110 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2c120 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
2c130 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
2c140 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2c150 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
2c160 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
2c170 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
2c180 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
2c190 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2c1a0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2c1b0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
2c1c0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2c1d0 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
2c1e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2c1f0 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
2c200 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
2c210 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2c220 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
2c230 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
2c240 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
2c250 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
2c260 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
2c270 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
2c280 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
2c290 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
2c2a0 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
2c2b0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2c2c0 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
2c2d0 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74    u32 szPageDflt
2c2e0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2c2f0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
2c300 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
2c310 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ze */.  const ch
2c320 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20  ar *zUri = 0;   
2c330 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20   /* URI args to 
2c340 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  copy */.  int nU
2c350 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ri = 0;         
2c360 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c370 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67  bytes of URI arg
2c380 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20  s at *zUri */.. 
2c390 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2c3a0 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
2c3b0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
2c3c0 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
2c3d0 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
2c3e0 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
2c3f0 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
2c400 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
2c410 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a  -journal). This.
2c420 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69    ** is the maxi
2c430 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
2c440 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ed for an in-mem
2c450 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
2c460 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e   handle .  ** an
2c470 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72  d a regular jour
2c480 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e  nal file-handle.
2c490 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65   Note that a "re
2c4a0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61  gular journal-ha
2c4b0 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62  ndle".  ** may b
2c4c0 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61  e a wrapper capa
2c4d0 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74  ble of caching t
2c4e0 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e  he first portion
2c4f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
2c500 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d    ** file in mem
2c510 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ory to implement
2c520 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2c530 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28  e optimization (
2c540 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65  see .  ** source
2c550 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29   file journal.c)
2c560 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
2c570 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2c580 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d  pVfs)>sqlite3Mem
2c590 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b  JournalSize() ){
2c5a0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2c5b0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2c5c0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
2c5d0 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65  (pVfs));.  }else
2c5e0 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
2c5f0 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2c600 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2c610 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20  Size());.  }..  
2c620 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
2c630 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
2c640 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
2c650 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
2c660 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
2c670 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c680 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69  MIT_MEMORYDB.  i
2c690 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2c6a0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d  _MEMORY ){.    m
2c6b0 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66  emDb = 1;.    if
2c6c0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2c6d0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2c6e0 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d       zPathname =
2c6f0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2c700 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (0, zFilename);.
2c710 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e        if( zPathn
2c720 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e  ame==0  ) return
2c730 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c740 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d       nPathname =
2c750 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c760 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2c770 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
2c780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2c790 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  if..  /* Compute
2c7a0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
2c7b0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
2c7c0 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
2c7d0 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
2c7e0 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
2c7f0 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
2c800 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
2c810 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2c820 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
2c830 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
2c840 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
2c850 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
2c860 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2c870 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2c880 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c890 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2c8a0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
2c8b0 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
2c8c0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ame = sqlite3DbM
2c8d0 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74  allocRaw(0, nPat
2c8e0 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2c8f0 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2c900 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2c910 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2c920 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2c930 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2c940 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2c950 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2c960 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2c970 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2c980 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2c990 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2c9a0 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2c9b0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2c9c0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2c9d0 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2c9e0 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2c9f0 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2ca00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2ca10 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2ca20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2ca30 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2ca40 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2ca50 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2ca60 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2ca70 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2ca80 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2ca90 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2caa0 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2cab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cac0 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2cad0 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2cae0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2caf0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2cb00 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2cb10 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2cb20 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2cb30 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2cb40 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2cb50 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2cb60 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2cb70 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2cb80 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2cb90 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2cba0 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2cbb0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2cbc0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2cbd0 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2cbe0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2cbf0 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2cc00 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2cc10 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2cc20 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2cc30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cc40 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2cc50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2cc60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cc70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2cc80 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2cc90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2cca0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2ccb0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2ccc0 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2ccd0 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2cce0 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2ccf0 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2cd00 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2cd10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2cd20 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2cd30 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2cd40 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2cd50 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2cd60 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2cd70 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2cd80 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2cd90 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2cda0 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2cdb0 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2cdc0 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2cdd0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2cde0 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2cdf0 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2ce00 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2ce10 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2ce20 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2ce30 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2ce40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2ce50 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2ce60 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2ce70 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2ce80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2ce90 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2cea0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2ceb0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2cec0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2cee0 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2cef0 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2cf00 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2cf10 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2cf20 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2cf30 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2cf40 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2cf50 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2cf60 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2cf70 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2cf80 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2cf90 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2cfa0 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2cfb0 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2cfc0 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2cfd0 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2cfe0 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2cff0 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2d000 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2d010 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2d020 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2d030 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2d040 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2d050 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2d060 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2d070 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2d080 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20  e + 8 + 2       
2d090 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2d0a0 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2d0b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2d0c0 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2d0d0 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  4 + 2           
2d0e0 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2d0f0 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2d100 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2d110 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2d120 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2d130 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2d140 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2d150 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2d160 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d180 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
2d190 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2d1a0 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2d1b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2d1c0 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2d1d0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d1e0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2d1f0 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2d200 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2d210 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2d220 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d230 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2d240 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2d250 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2d260 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2d270 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2d280 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2d290 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2d2a0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2d2b0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2d2c0 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2d2d0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d2e0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2d2f0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2d300 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2d310 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2d320 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2d330 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2d340 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2d350 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2d360 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2d370 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2d380 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2d390 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2d3a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2d3b0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2d3c0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d3d0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2d3e0 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2d3f0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2d400 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d410 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70  if( nUri ) memcp
2d420 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2d430 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2d440 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2d450 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2d460 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2d470 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d480 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2d490 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d4a0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2d4b0 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32  ournal\000", 8+2
2d4c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d4d0 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d4e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d4f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2d500 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d510 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2d520 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2d530 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d540 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2d550 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d560 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2d570 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d580 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2d590 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2d5a0 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2d5b0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2d5c0 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2d5d0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d5e0 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2d5f0 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
2d600 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d610 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2d620 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2d630 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2d640 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2d650 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2d660 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2d670 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2d680 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2d690 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2d6a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d6b0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2d6c0 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2d6d0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2d6e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2d6f0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2d700 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d710 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2d720 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2d730 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20  ert( !memDb );. 
2d740 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
2d750 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
2d760 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
2d770 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
2d780 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
2d790 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
2d7a0 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
2d7b0 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
2d7c0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2d7d0 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
2d7e0 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
2d7f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2d800 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
2d810 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
2d820 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
2d830 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
2d840 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2d850 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
2d860 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
2d870 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2d880 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
2d890 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
2d8a0 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
2d8b0 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
2d8c0 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
2d8d0 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2d8e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d8f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
2d900 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
2d910 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2d920 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
2d930 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f        if( !readO
2d940 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nly ){.        s
2d950 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2d960 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
2d970 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
2d980 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
2d990 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2d9a0 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
2d9b0 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2d9c0 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2d9d0 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2d9e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2d9f0 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
2da00 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2da10 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
2da20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2da30 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
2da40 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2da50 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
2da60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2da70 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33  szPageDflt = (u3
2da80 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  2)pPager->sector
2da90 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2daa0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64  }.        }.#ifd
2dab0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2dac0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2dad0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2dae0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2daf0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2db00 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
2db10 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
2db20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2db30 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2db40 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
2db50 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2db60 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
2db70 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2db80 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
2db90 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
2dba0 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
2dbb0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2dbc0 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
2dbd0 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
2dbe0 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
2dbf0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
2dc00 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
2dc10 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2dc20 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
2dc30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2dc40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
2dc50 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
2dc60 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2dc70 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  = sqlite3_uri_bo
2dc80 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2dc90 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20   "nolock", 0);. 
2dca0 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20       if( (iDc & 
2dcb0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d  SQLITE_IOCAP_IMM
2dcc0 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20  UTABLE)!=0.     
2dcd0 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69    || sqlite3_uri
2dce0 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61  _boolean(zFilena
2dcf0 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c  me, "immutable",
2dd00 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
2dd10 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c   vfsFlags |= SQL
2dd20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2dd30 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  Y;.          got
2dd40 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f  o act_like_temp_
2dd50 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  file;.      }.  
2dd60 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2dd70 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2dd80 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2dd90 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2dda0 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2ddb0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2ddc0 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2ddd0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2dde0 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2ddf0 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2de00 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2de10 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2de20 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2de30 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2de40 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2de50 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2de60 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2de70 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2de80 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2de90 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2dea0 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2deb0 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2dec0 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2ded0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2dee0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2def0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2df00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2df10 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72  is branch also r
2df20 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61  uns for files ma
2df30 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c  rked as immutabl
2df40 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c  e..    */ .act_l
2df50 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20  ike_temp_file:. 
2df60 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
2df70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
2df80 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
2df90 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65  ER;     /* Prete
2dfa0 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  nd we already ha
2dfb0 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ve a lock */.   
2dfc0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2dfd0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2dfe0 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2dff0 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49  e are in EXCLUSI
2e000 56 45 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  VE locking mode 
2e010 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2e020 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2e030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2e040 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2e050 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2e060 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2e070 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2e080 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2e090 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2e0a0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2e0b0 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2e0c0 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2e0d0 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2e0e0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2e0f0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2e100 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2e110 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2e120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2e130 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2e140 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2e150 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2e160 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2e170 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2e180 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2e190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e1a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
2e1b0 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2e1c0 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2e1d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e1e0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2e1f0 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
2e200 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55      nExtra = ROU
2e210 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20  ND8(nExtra);.   
2e220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2e230 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
2e240 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
2e250 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2e270 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2e280 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2e290 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2e2a0 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ache);.  }..  /*
2e2b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2e2c0 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65  urred above, fre
2e2d0 65 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72  e the  Pager str
2e2e0 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2e2f0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2e300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e310 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2e320 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2e330 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
2e340 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
2e350 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
2e360 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e370 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2e380 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
2e390 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
2e3a0 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
2e3b0 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
2e3c0 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
2e3d0 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
2e3e0 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
2e3f0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2e400 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2e410 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
2e420 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
2e430 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50  Journal;.  /* pP
2e440 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
2e450 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e460 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
2e470 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e480 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
2e490 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2e4a0 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
2e4b0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
2e4c0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2e4d0 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
2e4e0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e4f0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
2e500 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
2e510 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2e520 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
2e530 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
2e540 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
2e550 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
2e560 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
2e570 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
2e580 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
2e590 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2e5a0 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
2e5b0 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
2e5c0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2e5d0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2e5e0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2e5f0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2e600 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
2e610 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2e620 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
2e630 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
2e640 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
2e650 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2e660 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
2e670 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
2e680 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
2e690 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
2e6a0 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
2e6b0 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
2e6c0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
2e6d0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
2e6e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2e6f0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
2e700 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
2e710 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
2e720 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
2e730 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
2e740 20 30 20 3a 20 53 51 4c 49 54 45 5f 53 59 4e 43   0 : SQLITE_SYNC
2e750 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 50 61 67 65  _NORMAL;.  pPage
2e760 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2e770 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   = pPager->syncF
2e780 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67  lags;.  if( pPag
2e790 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2e7a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e7b0 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b  ->fullSync==0 );
2e7c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e7d0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2e7e0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e7f0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2e800 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2e810 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e820 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30  ckptSyncFlags==0
2e830 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2e840 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2e850 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
2e860 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
2e870 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2e880 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  L;.    pPager->w
2e890 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  alSyncFlags = SQ
2e8a0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2e8b0 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e   | WAL_SYNC_TRAN
2e8c0 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50  SACTIONS;.    pP
2e8d0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2e8e0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2e8f0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
2e900 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2e910 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
2e920 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
2e930 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
2e940 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2e950 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2e960 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
2e970 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
2e980 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
2e990 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2e9a0 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
2e9b0 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
2e9c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2e9d0 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
2e9e0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
2e9f0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
2ea00 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
2ea10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2ea20 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2ea30 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2ea40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
2ea50 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
2ea60 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2ea70 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2ea80 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
2ea90 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
2eaa0 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
2eab0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
2eac0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
2ead0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2eae0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
2eaf0 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
2eb00 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
2eb10 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
2eb20 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
2eb30 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  /* pPager->szMma
2eb40 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  p = SQLITE_DEFAU
2eb50 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20  LT_MMAP_SIZE // 
2eb60 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62  will be set by b
2eb70 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70  tree.c */..  *pp
2eb80 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
2eb90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2eba0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66  OK;.}.../* Verif
2ebb0 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
2ebc0 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  ase file has not
2ebd0 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72   be deleted or r
2ebe0 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a  enamed out from.
2ebf0 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61 67  ** under the pag
2ec00 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
2ec10 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74  TE_OK if the dat
2ec20 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  abase is still w
2ec30 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20  ere it ought.** 
2ec40 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20  to be on disk.  
2ec50 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
2ec60 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  (SQLITE_READONLY
2ec70 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65  _DBMOVED or some
2ec80 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
2ec90 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  code from sqlite
2eca0 33 4f 73 41 63 63 65 73 73 28 29 29 20 69 66 20  3OsAccess()) if 
2ecb0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
2ecc0 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a   gone missing..*
2ecd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61 74  /.static int dat
2ece0 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50  abaseIsUnmoved(P
2ecf0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2ed00 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d   int bHasMoved =
2ed10 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
2ed20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
2ed30 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  pFile ) return S
2ed40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2ed50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
2ed60 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2ed70 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
2ed80 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2ed90 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69  e && pPager->zFi
2eda0 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72  lename[0] );.  r
2edb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
2edc0 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
2edd0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
2ede0 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48  L_HAS_MOVED, &bH
2edf0 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20  asMoved);.  if( 
2ee00 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
2ee10 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  UND ){.    /* If
2ee20 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66   the HAS_MOVED f
2ee30 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75  ile-control is u
2ee40 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73  nimplemented, as
2ee50 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
2ee60 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  le.    ** has no
2ee70 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54  t been moved.  T
2ee80 68 61 74 20 69 73 20 74 68 65 20 68 69 73 74 6f  hat is the histo
2ee90 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f  rical behavior o
2eea0 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20  f SQLite: prior 
2eeb0 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  to.    ** versio
2eec0 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65  n 3.8.3, it neve
2eed0 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20  r checked */.   
2eee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2eef0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2ef00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48  =SQLITE_OK && bH
2ef10 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72  asMoved ){.    r
2ef20 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
2ef30 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d  NLY_DBMOVED;.  }
2ef40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ef50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2ef60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2ef70 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
2ef80 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
2ef90 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
2efa0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
2efb0 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
2efc0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
2efd0 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
2efe0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2eff0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
2f000 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
2f010 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
2f020 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
2f030 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
2f040 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
2f050 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
2f060 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
2f070 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
2f080 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
2f090 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
2f0a0 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2f0b0 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
2f0c0 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
2f0d0 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
2f0e0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2f0f0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2f100 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2f110 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
2f120 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
2f130 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
2f140 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2f150 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
2f160 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2f170 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
2f180 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2f190 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
2f1a0 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
2f1b0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2f1c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f1d0 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
2f1e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2f1f0 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
2f200 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
2f210 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
2f220 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
2f230 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
2f240 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
2f250 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2f260 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f270 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
2f280 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
2f290 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2f2a0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2f2b0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2f2c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
2f2d0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
2f2e0 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
2f2f0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
2f300 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
2f310 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2f320 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2f330 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
2f340 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2f350 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
2f360 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
2f370 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
2f380 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
2f390 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
2f3a0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
2f3b0 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
2f3c0 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
2f3d0 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
2f3e0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
2f3f0 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
2f400 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2f410 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
2f420 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
2f430 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
2f440 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
2f450 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
2f460 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
2f470 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2f480 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
2f490 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2f4a0 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
2f4b0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
2f4c0 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
2f4d0 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2f4e0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2f4f0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2f500 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2f510 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
2f520 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
2f530 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
2f540 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
2f550 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
2f560 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2f570 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
2f580 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
2f590 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2f5a0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
2f5b0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
2f5c0 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
2f5d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2f5e0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
2f5f0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
2f600 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f610 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
2f620 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2f630 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20  int exists = 1; 
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f650 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
2f660 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2f670 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c  nt */.  int jrnl
2f680 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28  Open = !!isOpen(
2f690 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20  pPager->jfd);.. 
2f6a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f6b0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2f6c0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2f6d0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
2f6e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f6f0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2f700 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  PEN );..  assert
2f710 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c  ( jrnlOpen==0 ||
2f720 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   ( sqlite3OsDevi
2f730 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2f740 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  s(pPager->jfd) &
2f750 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41  .    SQLITE_IOCA
2f760 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
2f770 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20  EN_OPEN.  ));.. 
2f780 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
2f790 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2f7a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2f7b0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
2f7c0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2f7d0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2f7e0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
2f7f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2f800 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
2f810 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
2f820 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20  locked = 0;     
2f830 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2f840 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
2f850 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2f860 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a   lock */..    /*
2f870 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
2f880 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
2f890 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
2f8a0 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
2f8b0 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
2f8c0 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
2f8d0 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
2f8e0 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
2f8f0 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
2f900 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
2f910 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
2f920 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
2f930 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
2f940 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
2f950 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
2f960 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
2f970 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2f980 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
2f990 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
2f9a0 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
2f9b0 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
2f9c0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2f9d0 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
2f9e0 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
2f9f0 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
2fa00 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
2fa10 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
2fa20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
2fa30 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
2fa40 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
2fa50 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
2fa60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2fa70 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
2fa80 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
2fa90 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
2faa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2fab0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
2fac0 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ked ){.      Pgn
2fad0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
2fae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2faf0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
2fb00 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2fb10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2fb20 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2fb30 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
2fb40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fb50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
2fb60 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2fb70 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20  e is zero pages 
2fb80 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65  in size, that me
2fb90 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
2fba0 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20  (1) the.        
2fbb0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20  ** journal is a 
2fbc0 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70  remnant from a p
2fbd0 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69  rior database wi
2fbe0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
2fbf0 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a   where.        *
2fc00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2fc10 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20  ile but not the 
2fc20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65  journal was dele
2fc30 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20  ted, or (2) the 
2fc40 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20  initial.        
2fc50 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
2fc60 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20  hat populates a 
2fc70 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
2fc80 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
2fc90 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  k..        ** In
2fca0 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
2fcb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
2fcc0 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20  an be deleted.  
2fcd0 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61  However, take ca
2fce0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  re.        ** no
2fcf0 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
2fd00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2fd10 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2fd20 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20  en due to.      
2fd30 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64    ** journal_mod
2fd40 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20  e=PERSIST..     
2fd50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2fd60 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a  ( nPage==0 && !j
2fd70 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
2fd80 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
2fd90 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
2fda0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2fdb0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
2fdc0 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
2fdd0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
2fde0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2fdf0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
2fe00 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2fe10 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
2fe20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2fe30 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
2fe40 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
2fe50 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
2fe60 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
2fe70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fe80 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
2fe90 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
2fea0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2feb0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2fec0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
2fed0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2fee0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
2fef0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
2ff00 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
2ff10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ff20 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
2ff30 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
2ff40 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
2ff50 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
2ff60 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
2ff70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2ff80 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
2ff90 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
2ffa0 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
2ffb0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
2ffc0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
2ffd0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
2ffe0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
2fff0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
30000 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
30010 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
30020 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23        int f = .#
30030 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
30040 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
30050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
30060 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
30070 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c  &SQLITE_OPEN_FIL
30080 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b  EPROTECTION_MASK
30090 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  )|.#endif.      
300a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
300b0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
300c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
300d0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
300e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
300f0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
30100 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
30110 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
30120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30130 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
30140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30150 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
30160 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
30170 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30180 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
30190 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
301a0 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
301b0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
301c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
301d0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
301e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
301f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
30200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30210 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
30220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30230 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
30240 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
30250 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30260 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
30270 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20   = (first!=0);. 
30280 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
30290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
302a0 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
302b0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
302c0 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72  annot open the r
302d0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
302e0 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
302f0 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20   see if.        
30300 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20      ** it has a 
30310 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
30320 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
30330 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
30340 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
30350 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
30360 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
30370 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
30380 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
30390 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
303a0 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
303b0 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
303c0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
303d0 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
303e0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
303f0 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
30400 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
30410 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
30420 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
30430 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
30440 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
30450 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
30460 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
30470 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
30480 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
30490 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
304a0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
304b0 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
304c0 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
304d0 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
304e0 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
304f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
30500 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
30510 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
30520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
30540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30550 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
30560 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
30570 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
30580 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
30590 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
305a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
305b0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
305c0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
305d0 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
305e0 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
305f0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
30600 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
30610 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
30620 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
30630 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
30640 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
30650 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
30660 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
30670 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
30680 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
30690 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
306a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
306b0 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
306c0 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
306d0 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
306e0 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
306f0 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
30700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30710 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
30720 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
30730 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
30740 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
30750 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30760 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
30770 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
30780 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
30790 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
307a0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
307b0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
307c0 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
307d0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
307e0 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
307f0 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
30800 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
30810 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
30820 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
30830 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
30840 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
30850 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
30860 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
30870 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
30880 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
30890 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
308a0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
308b0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
308c0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
308d0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
308e0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
308f0 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
30900 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
30910 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
30920 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
30930 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
30940 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
30950 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
30960 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
30970 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
30980 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
30990 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
309a0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
309b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
309c0 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
309d0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
309e0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
309f0 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
30a00 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
30a10 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
30a20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
30a30 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
30a40 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
30a50 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
30a60 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
30a70 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
30a80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
30a90 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
30aa0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
30ab0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
30ac0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
30ad0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
30ae0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
30af0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
30b00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30b10 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
30b20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
30b30 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
30b40 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
30b50 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
30b60 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
30b70 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
30b80 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
30b90 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
30ba0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
30bb0 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
30bc0 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
30bd0 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
30be0 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
30bf0 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
30c00 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
30c10 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
30c20 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
30c30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30c40 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
30c50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30c60 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
30c70 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
30c80 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
30c90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30ca0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30cb0 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
30cc0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
30cd0 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
30ce0 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
30cf0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
30d00 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
30d10 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
30d20 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
30d30 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
30d40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30d50 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
30d60 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
30d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30d80 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
30d90 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
30da0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
30db0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
30dc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
30dd0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
30de0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
30df0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30e10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30e20 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
30e30 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
30e40 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
30e50 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
30e60 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
30e70 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
30e80 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
30e90 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
30ea0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
30eb0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
30ec0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
30ed0 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
30ee0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
30ef0 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
30f00 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
30f10 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
30f20 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
30f30 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
30f40 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
30f50 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
30f60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30f70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
30f80 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
30f90 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
30fa0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
30fb0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
30fc0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
30fd0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
30fe0 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
30ff0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
31000 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31010 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
31020 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
31030 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
31040 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
31050 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
31060 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
31070 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
31080 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
31090 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
310a0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
310b0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
310c0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
310d0 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
310e0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
310f0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
31100 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
31110 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
31120 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
31130 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
31140 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
31150 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
31160 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
31170 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
31180 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
31190 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
311a0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
311b0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
311c0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
311d0 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
311e0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
311f0 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
31200 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
31210 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
31220 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
31230 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
31240 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
31250 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
31260 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
31270 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
31280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31290 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
312a0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
312b0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
312c0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
312d0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
312e0 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
312f0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
31300 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
31310 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
31320 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
31330 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31340 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
31350 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
31360 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31380 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31390 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
313a0 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
313b0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
313c0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
313d0 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
313e0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
313f0 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
31400 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
31410 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
31420 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
31430 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
31440 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
31450 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
31460 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
31470 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
31480 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
31490 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
314a0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
314b0 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
314c0 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
314d0 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
314e0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
314f0 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
31500 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
31510 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
31520 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
31530 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
31540 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
31550 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
31560 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
31570 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
31580 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
31590 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
315a0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
315b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
315c0 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
315d0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
315e0 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
315f0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
31600 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
31610 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
31620 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
31630 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
31640 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
31650 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
31660 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
31670 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
31680 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
31690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
316a0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
316b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
316c0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
316d0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
316e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
316f0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
31700 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
31710 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
31720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31730 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
31740 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
31750 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31760 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
31770 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
31780 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
31790 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
317a0 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
317b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
317c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
317d0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
317e0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
317f0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
31800 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   = .#if SQLITE_E
31810 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
31820 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  CTION.          
31830 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
31840 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
31850 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
31860 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
31870 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
31880 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
31890 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
318a0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
318b0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
318c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
318d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
318e0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
318f0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
31900 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
31910 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
31920 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
31930 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
31940 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
31950 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
31960 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31970 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
31980 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
31990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
319a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
319b0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
319c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
319d0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
319e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
319f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31a00 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
31a10 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
31a20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
31a30 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
31a40 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
31a50 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
31a60 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
31a70 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
31a80 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
31a90 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
31aa0 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
31ab0 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
31ac0 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
31ad0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
31ae0 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
31af0 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
31b00 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
31b10 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
31b20 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
31b30 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
31b40 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
31b50 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
31b60 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
31b70 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
31b80 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
31b90 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
31ba0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
31bb0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
31bc0 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
31bd0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
31be0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
31bf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
31c00 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
31c10 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
31c20 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
31c30 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
31c40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31c50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31c60 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
31c70 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
31c80 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 1);.         
31c90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
31ca0 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
31cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
31cc0 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
31cd0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
31ce0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
31cf0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
31d00 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
31d10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
31d20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31d30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
31d40 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
31d50 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
31d60 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
31d70 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
31d80 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
31d90 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
31da0 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
31db0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
31dc0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
31dd0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
31de0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
31df0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
31e00 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
31e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
31e20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
31e30 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
31e40 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
31e50 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
31e60 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
31e70 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
31e80 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
31e90 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
31ea0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
31eb0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
31ec0 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
31ed0 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
31ee0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
31ef0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
31f00 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
31f10 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
31f20 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
31f30 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
31f40 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
31f50 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
31f60 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
31f70 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
31f80 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
31f90 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
31fa0 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
31fb0 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
31fc0 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
31fd0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
31fe0 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
31ff0 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
32000 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
32010 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
32020 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
32030 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
32040 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
32050 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
32060 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
32070 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
32080 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
32090 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
320a0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
320b0 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
320c0 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
320d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
320e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
320f0 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
32100 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
32110 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
32120 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
32130 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
32140 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
32150 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32160 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
32170 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
32180 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
32190 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
321a0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
321b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
321c0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
321d0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
321e0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
321f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
32200 6d 70 46 69 6c 65 20 26 26 20 28 0a 20 20 20 20  mpFile && (.    
32210 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 61 63      pPager->pBac
32220 6b 75 70 20 0a 20 20 20 20 20 7c 7c 20 73 71 6c  kup .     || sql
32230 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
32240 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
32250 63 68 65 29 3e 30 20 0a 20 20 20 20 20 7c 7c 20  che)>0 .     || 
32260 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
32270 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 2f  .    )){.      /
32280 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
32290 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
322a0 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
322b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
322c0 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
322d0 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
322e0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
322f0 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
32300 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
32310 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
32320 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
32330 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
32340 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
32350 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
32360 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32370 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
32380 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
32390 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
323a0 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
323b0 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
323c0 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
323d0 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
323e0 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
323f0 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
32400 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
32410 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
32420 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
32430 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
32440 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
32450 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
32460 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
32470 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
32480 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
32490 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
324a0 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
324b0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
324c0 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
324d0 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
324e0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
324f0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
32500 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
32510 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
32520 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
32530 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
32540 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
32550 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
32560 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
32570 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
32580 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
32590 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  /.      Pgno nPa
325a0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  ge = 0;.      ch
325b0 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
325c0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
325d0 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20  ileVers)];..    
325e0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
325f0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
32600 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
32610 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65   rc ) goto faile
32620 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50  d;..      if( nP
32630 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  age>0 ){.       
32640 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
32650 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
32660 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
32670 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
32680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
32690 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
326a0 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
326b0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
326c0 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
326d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
326e0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
326f0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
32700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
32710 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
32720 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
32730 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
32740 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
32750 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
32760 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
32770 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
32780 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
32790 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
327a0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
327b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
327c0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
327d0 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  er);..        /*
327e0 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62   Unmap the datab
327f0 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20  ase file. It is 
32800 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65 78  possible that ex
32810 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73  ternal processes
32820 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
32830 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20 74  have truncated t
32840 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32850 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64   and then extend
32860 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20  ed it back.     
32870 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69     ** to its ori
32880 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65  ginal size while
32890 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77 61   this process wa
328a0 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20  s not holding a 
328b0 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  lock..        **
328c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
328d0 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61 20  ere may exist a 
328e0 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69  Pager.pMap mappi
328f0 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73 0a  ng that appears.
32900 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
32910 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 20   the right size 
32920 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61  but is not actua
32930 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64  lly valid. Avoid
32940 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
32950 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20   possibility by 
32960 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62  unmapping the db
32970 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20   here. */.      
32980 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
32990 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
329a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
329b0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
329c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
329d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
329e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
329f0 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
32a00 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
32a10 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
32a20 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
32a30 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
32a40 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
32a50 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
32a60 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
32a70 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
32a80 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
32a90 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e  nt(pPager);.#ifn
32aa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32ab0 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20  WAL.    assert( 
32ac0 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20  pPager->pWal==0 
32ad0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
32ae0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   );.#endif.  }..
32af0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
32b00 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
32b10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
32b20 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
32b30 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
32b40 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
32b50 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
32b60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32b70 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
32b80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32b90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
32ba0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
32bb0 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
32bc0 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
32bd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
32bf0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
32c00 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
32c10 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
32c20 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
32c30 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
32c40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
32c50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
32c60 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d  AGER_READER;.  }
32c70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32c80 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
32c90 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
32ca0 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
32cb0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
32cc0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
32cd0 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
32ce0 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
32cf0 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
32d00 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
32d10 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
32d20 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
32d30 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
32d40 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
32d50 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
32d60 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
32d70 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
32d80 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
32d90 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
32da0 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
32db0 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
32dc0 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
32dd0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
32de0 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30  ger->nMmapOut==0
32df0 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61 63   && (sqlite3Pcac
32e00 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
32e10 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
32e20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
32e30 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
32e40 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
32e50 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
32e60 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
32e70 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
32e80 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
32e90 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
32ea0 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
32eb0 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
32ec0 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
32ed0 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
32ee0 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
32ef0 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
32f00 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
32f10 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
32f20 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
32f30 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
32f40 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
32f50 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
32f60 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
32f70 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
32f80 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
32f90 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
32fa0 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
32fb0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
32fc0 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
32fd0 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
32fe0 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
32ff0 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
33000 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
33010 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
33020 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
33030 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
33040 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
33050 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
33060 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
33070 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
33080 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
33090 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
330a0 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
330b0 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
330c0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
330d0 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
330e0 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
330f0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
33100 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
33110 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
33120 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
33130 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
33140 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
33150 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
33160 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
33170 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
33180 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
33190 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
331a0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
331b0 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
331c0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
331d0 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
331e0 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
331f0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
33200 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
33210 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
33220 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
33230 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
33240 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
33250 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
33260 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
33270 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
33280 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
33290 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
332a0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
332b0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
332c0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
332d0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
332e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
332f0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
33300 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
33310 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
33320 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
33330 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
33340 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
33350 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
33360 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
33370 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
33380 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
33390 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
333a0 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
333b0 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
333c0 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
333d0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
333e0 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
333f0 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
33400 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
33410 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
33420 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
33430 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
33440 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20   zeroed instead 
33450 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  of.** being read
33460 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33470 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
33480 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
33490 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
334a0 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
334b0 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
334c0 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
334d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
334e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
334f0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
33500 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
33510 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
33520 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
33530 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
33540 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
33550 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
33560 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
33570 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
33580 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
33590 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
335a0 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
335b0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
335c0 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
335d0 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
335e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
335f0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
33600 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
33610 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
33620 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
33630 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
33640 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
33650 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
33660 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
33670 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
33680 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
33690 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
336a0 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
336b0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
336c0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
336d0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
336e0 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
336f0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
33700 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
33710 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
33720 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
33730 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
33740 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
33750 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
33760 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
33770 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
33780 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
33790 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
337a0 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
337b0 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
337c0 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
337d0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
337e0 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
337f0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
33800 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
33810 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
33820 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
33830 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
33840 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
33850 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
33860 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
33870 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
33880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33890 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
338a0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
338b0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
338c0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
338d0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
338e0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
338f0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
33900 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
33910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
33920 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
33930 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
33940 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
33950 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
33960 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
33970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33980 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
33990 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
339a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
339b0 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67  oContent = (flag
339c0 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  s & PAGER_GET_NO
339d0 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20  CONTENT);..  /* 
339e0 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c 65  It is acceptable
339f0 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f   to use a read-o
33a00 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20  nly (mmap) page 
33a10 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78 63  for any page exc
33a20 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20  ept.  ** page 1 
33a30 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  if there is no w
33a40 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
33a50 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51   open or the ACQ
33a60 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  UIRE_READONLY.  
33a70 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65 63  ** flag was spec
33a80 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  ified by the cal
33a90 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67  ler. And so long
33aa0 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f   as the db is no
33ab0 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  t a .  ** tempor
33ac0 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
33ad0 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
33ae0 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70   const int bMmap
33af0 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26 26  Ok = (pgno!=1 &&
33b00 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
33b10 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
33b20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
33b30 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20  EADER || (flags 
33b40 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  & PAGER_GET_READ
33b50 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66 20 53 51  ONLY)).#ifdef SQ
33b60 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
33b70 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f    && pPager->xCo
33b80 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  dec==0.#endif.  
33b90 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
33ba0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
33bb0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
33bc0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33bd0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33be0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
33bf0 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20  noContent==0 || 
33c00 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20  bMmapOk==0 );.. 
33c10 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
33c20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33c30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33c40 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33c50 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
33c60 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
33c70 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d  turn an error im
33c80 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a  mediately. .  **
33c90 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75   Otherwise, requ
33ca0 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f  est the page fro
33cb0 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79  m the PCache lay
33cc0 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  er. */.  if( pPa
33cd0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
33ce0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
33cf0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
33d00 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
33d10 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
33d20 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
33d30 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
33d40 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
33d50 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
33d60 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
33d70 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
33d80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
33d90 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
33da0 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
33db0 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
33dc0 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   iFrame==0 ){.  
33dd0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
33de0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  = 0;..      rc =
33df0 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28   sqlite3OsFetch(
33e00 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20  pPager->fd, .   
33e10 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e         (i64)(pgn
33e20 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
33e30 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
33e40 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74  >pageSize, &pDat
33e50 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  a.      );..    
33e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33e70 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a  _OK && pData ){.
33e80 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
33e90 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
33ea0 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20  _READER ){.     
33eb0 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
33ec0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
33ed0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
33ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
33ef0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
33f00 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
33f10 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
33f20 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44  pPager, pgno, pD
33f30 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ata, &pPg);.    
33f40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33f50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
33f60 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
33f70 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a  , (i64)(pgno-1)*
33f80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
33f90 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
33fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
33fb0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pPg ){.         
33fc0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
33fd0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
33fe0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
33ff0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  g;.          ret
34000 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
34010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34020 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34040 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34050 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34060 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b    }.    }..    {
34070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70  .      sqlite3_p
34080 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73  cache_page *pBas
34090 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d  e;.      pBase =
340a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
340b0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
340c0 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20  che, pgno, 3);. 
340d0 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d       if( pBase==
340e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
340f0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
34100 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65  etchStress(pPage
34110 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
34120 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20  , &pBase);.     
34130 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34140 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
34150 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
34170 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c   = *ppPage = sql
34180 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
34190 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
341a0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61  Cache, pgno, pBa
341b0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
341c0 50 67 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  Pg==0 ) rc = SQL
341d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
341e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
341f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34200 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
34210 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
34220 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
34230 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
34240 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
34250 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
34260 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
34270 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
34280 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
34290 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
342a0 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
342b0 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
342c0 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
342d0 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
342e0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
342f0 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
34300 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
34310 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
34320 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
34330 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
34340 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
34350 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
34360 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
34370 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
34380 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
34390 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
343a0 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
343b0 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
343c0 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
343d0 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
343e0 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
343f0 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
34400 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
34410 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
34420 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
34430 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
34440 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
34450 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
34460 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
34470 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
34480 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
34490 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
344a0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
344b0 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
344c0 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
344d0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
344e0 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a   */..    pPg = *
344f0 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
34500 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
34510 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
34520 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
34530 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
34540 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34550 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
34560 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
34570 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
34580 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
34590 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
345a0 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
345b0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
345c0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
345d0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
345e0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
345f0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
34600 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
34610 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34620 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34630 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
34640 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
34650 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
34660 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
34670 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
34680 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
34690 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
346a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
346b0 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
346c0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
346d0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
346e0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
346f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
34700 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
34710 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
34720 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
34730 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
34740 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
34750 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
34760 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
34770 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
34780 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
34790 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
347a0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
347b0 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
347c0 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
347d0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
347e0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
347f0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
34800 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
34810 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
34820 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
34830 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
34840 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34850 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
34860 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
34870 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
34880 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
34890 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
348a0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
348b0 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
348c0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
348d0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
348e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
348f0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
34900 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34910 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
34920 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
34930 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
34940 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
34950 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34970 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
34980 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
34990 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
349a0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
349b0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
349c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
349d0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
349e0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
349f0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
34a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
34a10 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
34a20 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f  Pager) && bMmapO
34a30 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
34a40 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
34a50 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
34a60 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
34a70 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  rame);.        i
34a80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34a90 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
34aa0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34ab0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
34ac0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
34ad0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
34ae0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
34af0 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
34b00 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
34b10 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
34b20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34b30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34b40 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
34b50 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
34b70 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
34b80 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ash(pPg);.  }.. 
34b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34ba0 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
34bb0 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
34bc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34bd0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
34be0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
34bf0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
34c00 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
34c10 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
34c20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
34c30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34c40 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
34c50 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
34c60 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
34c70 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
34c80 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
34c90 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
34ca0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
34cb0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
34cc0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
34cd0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
34ce0 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  he. .**.** See a
34cf0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
34d00 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
34d10 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
34d20 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
34d30 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
34d40 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
34d50 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
34d60 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
34d70 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
34d80 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
34d90 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
34da0 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
34db0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
34dc0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
34dd0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
34de0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
34df0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
34e00 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
34e10 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
34e20 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
34e30 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
34e40 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gno){.  sqlite3_
34e50 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61  pcache_page *pPa
34e60 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
34e70 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
34e80 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
34e90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34ea0 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
34eb0 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65    pPage = sqlite
34ec0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
34ed0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
34ee0 6e 6f 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  no, 0);.  return
34ef0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34f00 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
34f10 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34f20 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pPage);.}../*.*
34f30 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
34f40 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
34f50 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
34f60 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
34f70 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
34f80 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
34f90 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
34fa0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
34fb0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
34fc0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
34fd0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
34fe0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
34ff0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
35000 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
35010 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
35020 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
35030 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
35040 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67  Null(DbPage *pPg
35050 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
35060 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
35070 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  g!=0 );.  pPager
35080 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
35090 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
350a0 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b   & PGHDR_MMAP ){
350b0 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65 61 73  .    pagerReleas
350c0 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20  eMapPage(pPg);. 
350d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
350e0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
350f0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
35100 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
35110 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64  (pPager);.}.void
35120 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35130 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
35140 0a 20 20 69 66 28 20 70 50 67 20 29 20 73 71 6c  .  if( pPg ) sql
35150 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
35160 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f  tNull(pPg);.}../
35170 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
35180 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
35190 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
351a0 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
351b0 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
351c0 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
351d0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
351e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
351f0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
35200 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
35210 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
35220 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
35230 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
35240 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
35250 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
35260 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
35270 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
35280 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
35290 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
352a0 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
352b0 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
352c0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
352d0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
352e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
352f0 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
35300 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
35310 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
35320 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
35330 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
35340 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
35350 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
35360 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
35370 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
35380 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35390 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
353a0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
353b0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
353c0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
353d0 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
353e0 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
353f0 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
35400 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
35410 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
35420 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
35430 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
35440 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
35450 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
35460 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
35470 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
35480 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
35490 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
354a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
354b0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
354c0 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
354d0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
354e0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
354f0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
35500 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
35510 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
35520 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
35530 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
35540 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
35550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35560 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
35570 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
35580 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
35590 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
355a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
355b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
355d0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
355e0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
355f0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
35600 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
35610 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
35620 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
35630 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35640 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
35650 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
35660 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35670 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35680 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35690 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
356a0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
356b0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
356c0 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
356d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
356e0 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
356f0 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
35700 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
35710 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
35720 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
35730 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
35740 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
35750 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
35760 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
35770 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35780 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
35790 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
357a0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
357b0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
357c0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
357d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
357e0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
357f0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
35800 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
35810 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
35820 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
35830 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35840 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
35850 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
35860 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35870 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
35880 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
35890 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
358a0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
358b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
358c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
358d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
358e0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
358f0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
35900 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
35910 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
35920 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
35930 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
35940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35950 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
35960 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
35970 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
35980 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
35990 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 28  TION.          (
359a0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
359b0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c  &SQLITE_OPEN_FIL
359c0 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b  EPROTECTION_MASK
359d0 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  )|.#endif.      
359e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
359f0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
35a00 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
35a10 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
35a20 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
35a30 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
35a40 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
35a50 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
35a60 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
35a70 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
35a80 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
35a90 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20  RNAL).          
35aa0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 56  );..        /* V
35ab0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
35ac0 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61  atabase still ha
35ad0 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
35ae0 61 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20  as it did when. 
35af0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73         ** it was
35b00 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
35b10 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ed. */.        r
35b20 63 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e  c = databaseIsUn
35b30 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20  moved(pPager);. 
35b40 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
35b50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64  QLITE_OK ){.#ifd
35b60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35b70 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
35b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35b90 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
35ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
35bb0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
35bc0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
35bd0 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
35be0 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
35bf0 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 23  ).          );.#
35c00 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72  else.          r
35c10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
35c20 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
35c30 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
35c40 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
35c50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
35c60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
35c70 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
35c80 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
35c90 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
35ca0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20  .    }.  .  .   
35cb0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
35cc0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
35cd0 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  er to the journa
35ce0 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20  l file and open 
35cf0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
35d00 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
35d10 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
35d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35d30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
35d40 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
35d50 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
35d60 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
35d70 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
35d80 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
35d90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35da0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
35db0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
35dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
35dd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
35de0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
35df0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
35e00 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
35e10 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
35e20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
35e30 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
35e40 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
35e50 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
35e60 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
35e70 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
35e80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35e90 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35ea0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
35eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
35ec0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
35ed0 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a  R_CACHEMOD;.  }.
35ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35ef0 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
35f00 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
35f10 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
35f20 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
35f30 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
35f40 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
35f50 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
35f60 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
35f70 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
35f80 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
35f90 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
35fa0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
35fb0 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
35fc0 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
35fd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35fe0 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
35ff0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
36000 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
36010 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
36020 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
36030 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
36040 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
36050 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
36060 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
36070 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
36080 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
36090 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
360a0 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
360b0 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
360c0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
360d0 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
360e0 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
360f0 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
36100 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
36110 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
36120 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
36130 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
36140 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
36150 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
36160 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
36170 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
36180 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
36190 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
361a0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
361b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
361c0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
361d0 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
361e0 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
361f0 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
36200 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
36210 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
36220 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
36230 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
36240 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
36250 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
36260 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
36270 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
36280 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
36290 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
362a0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
362b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
362c0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
362d0 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  rrCode;.  assert
362e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
362f0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
36300 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
36310 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  <PAGER_ERROR );.
36320 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
36330 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
36340 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
36350 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  ( ALWAYS(pPager-
36360 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36370 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73  EADER) ){.    as
36380 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
36390 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a  nJournal==0 );..
363a0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
363b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
363c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
363d0 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72  ager is configur
363e0 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e  ed to use lockin
363f0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
36400 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a  , and an.      *
36410 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  * exclusive lock
36420 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36430 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
36440 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20  held, obtain it 
36450 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  now..      */.  
36460 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
36470 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
36480 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
36490 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
364a0 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  >pWal, -1) ){.  
364b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
364c0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
364d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
364e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
364f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36500 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
36510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36520 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78      sqlite3WalEx
36530 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
36540 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20  er->pWal, 1);.  
36550 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
36560 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c  Grab the write l
36570 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66  ock on the log f
36580 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
36590 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20  ul, upgrade to. 
365a0 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45       ** PAGER_RE
365b0 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74  SERVED state. Ot
365c0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
365d0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
365e0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
365f0 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
36600 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
36610 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
36620 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
36630 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
36640 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
36650 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
36660 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
36670 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
36680 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
36690 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
366a0 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
366b0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
366c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
366d0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45    /* Obtain a RE
366e0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
366f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36700 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  . If the exFlag 
36710 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20  parameter.      
36720 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
36730 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
36740 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
36750 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
36760 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73  The.      ** bus
36770 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
36780 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ck can be used w
36790 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f  hen upgrading to
367a0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20   the EXCLUSIVE. 
367b0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75       ** lock, bu
367c0 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69  t not when obtai
367d0 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45  ning the RESERVE
367e0 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  D lock..      */
367f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
36800 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
36810 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
36820 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36830 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61  LITE_OK && exFla
36840 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
36850 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
36860 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
36870 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
36880 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
36890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
368a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  OK ){.      /* C
368b0 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f  hange to WRITER_
368c0 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20  LOCKED state..  
368d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
368e0 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61  WAL mode sets Pa
368f0 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41  ger.eState to PA
36900 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
36910 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20  D or CACHEMOD.  
36920 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68      ** when it h
36930 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  as an open trans
36940 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65  action, but neve
36950 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49  r to DBMOD or FI
36960 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a  NISHED..      **
36970 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
36980 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73   in those states
36990 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
369a0 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  l back savepoint
369b0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
369c0 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79  actions may copy
369d0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
369e0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ub-journal into 
369f0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
36a00 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77      ** file as w
36a10 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20  ell as into the 
36a20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63  page cache. Whic
36a30 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72  h would be incor
36a40 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a  rect in .      *
36a50 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20  * WAL mode..    
36a60 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
36a70 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
36a80 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b  R_WRITER_LOCKED;
36a90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
36aa0 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
36ab0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
36ac0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
36ad0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
36ae0 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
36af0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
36b00 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
36b10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36b20 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
36b30 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
36b40 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
36b50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
36b60 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
36b70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36b80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
36b90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36ba0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
36bb0 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65  CKED );.    asse
36bc0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
36bd0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
36be0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
36bf0 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
36c00 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
36c10 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65  (pPager)));.  re
36c20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
36c30 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
36c40 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
36c50 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
36c60 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
36c70 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
36c80 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
36c90 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
36ca0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
36cb0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
36cc0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
36cd0 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
36ce0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
36cf0 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
36d00 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
36d10 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
36d20 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
36d30 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
36d40 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
36d50 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
36d60 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
36d70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
36d80 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
36d90 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
36da0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
36db0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
36dc0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 6e  ITE_OK;.  int in
36dd0 4a 6f 75 72 6e 61 6c 3b 0a 0a 20 20 2f 2a 20 54  Journal;..  /* T
36de0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
36df0 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73  ot called unless
36e00 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
36e10 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
36e20 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72   .  ** been star
36e30 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ted. The journal
36e40 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79   file may or may
36e50 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20   not be open at 
36e60 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
36e70 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c   It is never cal
36e80 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52  led in the ERROR
36e90 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61   state..  */.  a
36ea0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36eb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36ec0 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
36ed0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
36ee0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36ef0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
36f00 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
36f10 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36f20 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
36f30 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
36f40 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
36f50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36f60 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
36f70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
36f80 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d  Pager->readOnly=
36f90 3d 30 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  =0 );..  CHECK_P
36fa0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
36fb0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
36fc0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65   needs to be ope
36fd0 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65  ned. Higher leve
36fe0 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  l routines have 
36ff0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74  already.  ** obt
37000 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
37010 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67  ary locks to beg
37020 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  in the write-tra
37030 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68  nsaction, but th
37040 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  e.  ** rollback 
37050 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
37060 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f  t yet be open. O
37070 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68  pen it now if th
37080 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
37090 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
370a0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61  s done before ca
370b0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
370c0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f  cheMakeDirty() o
370d0 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a  n the page. .  *
370e0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
370f0 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74  it were done aft
37100 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  er calling sqlit
37110 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
37120 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  y(), then.  ** a
37130 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63  n error might oc
37140 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65  cur and the page
37150 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69  r would end up i
37160 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
37170 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20  state.  ** with 
37180 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20  pages marked as 
37190 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63  dirty in the cac
371a0 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  he..  */.  if( p
371b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
371c0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
371d0 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ED ){.    rc = p
371e0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
371f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
37200 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37210 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37220 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
37230 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
37240 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
37250 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
37260 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
37270 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
37280 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
37290 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
372a0 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
372b0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
372c0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
372d0 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
372e0 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
372f0 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ay..  */.  sqlit
37300 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
37310 79 28 70 50 67 29 3b 0a 20 20 69 6e 4a 6f 75 72  y(pPg);.  inJour
37320 6e 61 6c 20 3d 20 70 61 67 65 49 6e 4a 6f 75 72  nal = pageInJour
37330 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29  nal(pPager, pPg)
37340 3b 0a 20 20 69 66 28 20 69 6e 4a 6f 75 72 6e 61  ;.  if( inJourna
37350 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6e 53  l && (pPager->nS
37360 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 21  avepoint==0 || !
37370 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
37380 28 70 50 67 29 29 20 29 7b 0a 20 20 20 20 61 73  (pPg)) ){.    as
37390 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
373a0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
373b0 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
373c0 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
373d0 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
373e0 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
373f0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
37400 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
37410 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
37420 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
37430 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
37440 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
37450 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
37460 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
37470 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
37480 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
37490 20 20 20 69 66 28 20 21 69 6e 4a 6f 75 72 6e 61     if( !inJourna
374a0 6c 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  l && !pagerUseWa
374b0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
374c0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
374d0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
374e0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
374f0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
37500 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20  ->dbOrigSize && 
37510 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
37520 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  fd) ){.        u
37530 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
37540 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
37550 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66          i64 iOff
37560 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
37570 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20  alOff;..        
37580 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
37590 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
375a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
375b0 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
375c0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
375d0 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
375e0 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
375f0 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
37600 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
37610 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
37620 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37630 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
37640 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
37650 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73   );..        ass
37660 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
37670 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d  rnalHdr<=pPager-
37680 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
37690 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
376a0 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
376b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
376c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
376d0 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
376e0 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
376f0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
37700 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
37710 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e  .        /* Even
37720 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73   if an IO or dis
37730 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75  kfull error occu
37740 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c  rs while journal
37750 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20  ling the.       
37760 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
37770 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74  block above, set
37780 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66   the need-sync f
37790 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65  lag for the page
377a0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  ..        ** Oth
377b0 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
377c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
377d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
377e0 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20   logic in.      
377f0 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
37800 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
37810 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
37820 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
37830 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a  stored.        *
37840 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
37850 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61  e file. And if a
37860 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
37870 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
37880 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
37890 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
378a0 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20   follow..       
378b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d   */.        pPg-
378c0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
378d0 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20  NEED_SYNC;..    
378e0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
378f0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
37900 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  , iOff, pPg->pgn
37910 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
37920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
37940 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
37950 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
37960 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
37970 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f  er->pageSize, iO
37980 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69  ff+4);.        i
37990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
379a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
379b0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
379c0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
379d0 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d  fd, iOff+pPager-
379e0 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73  >pageSize+4, cks
379f0 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  um);.        if(
37a00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
37a20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
37a30 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
37a40 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
37a50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
37a60 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
37a70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
37a80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
37a90 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
37aa0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
37ab0 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
37ac0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
37ad0 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
37ae0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
37af0 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
37b00 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
37b10 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
37b20 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
37b30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
37b40 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
37b50 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
37b60 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
37b70 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20  pPg)));..       
37b80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37b90 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65  Off += 8 + pPage
37ba0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
37bb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
37bc0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
37bd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37be0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
37bf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37c00 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
37c10 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
37c20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
37c30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
37c40 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
37c50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37c60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37c70 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
37c80 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
37c90 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
37ca0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
37cb0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
37cc0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
37cf0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
37d00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
37d10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
37d20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
37d30 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
37d40 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
37d50 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a  WRITER_DBMOD ){.
37d60 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
37d70 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
37d80 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
37d90 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
37da0 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25  TRACE(("APPEND %
37db0 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
37dc0 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
37dd0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
37de0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
37df0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
37e00 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
37e10 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
37e20 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20  C)?1:0)));.     
37e30 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
37e40 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
37e50 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
37e60 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
37e70 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
37e80 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
37e90 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
37ea0 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
37eb0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
37ec0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
37ed0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
37ee0 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
37ef0 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
37f00 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
37f10 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
37f20 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
37f30 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
37f40 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
37f50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
37f60 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 26 26  >nSavepoint>0 &&
37f70 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
37f80 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
37f90 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
37fa0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
37fb0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
37fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
37fd0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
37fe0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
37ff0 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
38000 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
38010 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
38020 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
38030 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
38040 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61 6e  This is a varian
38050 74 20 6f 66 20 73 71 6c 69 74 65 33 50 61 67 65  t of sqlite3Page
38060 72 57 72 69 74 65 28 29 20 74 68 61 74 20 72 75  rWrite() that ru
38070 6e 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 74  ns when the sect
38080 6f 72 20 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61  or size.** is la
38090 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
380a0 67 65 20 73 69 7a 65 2e 20 20 53 51 4c 69 74 65  ge size.  SQLite
380b0 20 6d 61 6b 65 73 20 74 68 65 20 28 72 65 61 73   makes the (reas
380c0 6f 6e 61 62 6c 65 29 20 61 73 73 75 6d 70 74 69  onable) assumpti
380d0 6f 6e 20 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62  on that.** all b
380e0 79 74 65 73 20 6f 66 20 61 20 73 65 63 74 6f 72  ytes of a sector
380f0 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 67   are written tog
38100 65 74 68 65 72 20 62 79 20 68 61 72 64 77 61 72  ether by hardwar
38110 65 2e 20 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62  e.  Hence, all b
38120 79 74 65 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63  ytes of.** a sec
38130 74 6f 72 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  tor need to be j
38140 6f 75 72 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73  ournalled in cas
38150 65 20 6f 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  e of a power los
38160 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  s in the middle 
38170 6f 66 0a 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a  of.** a write..*
38180 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
38190 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
381a0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
381b0 75 61 6c 20 74 6f 20 74 68 65 20 70 61 67 65 20  ual to the page 
381c0 73 69 7a 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a  size, in which.*
381d0 2a 20 63 61 73 65 20 70 61 67 65 73 20 63 61 6e  * case pages can
381e0 20 62 65 20 69 6e 64 69 76 69 64 75 61 6c 6c 79   be individually
381f0 20 77 72 69 74 74 65 6e 2e 20 20 54 68 69 73 20   written.  This 
38200 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e  routine only run
38210 73 20 69 6e 20 74 68 65 20 65 78 63 65 70 74 69  s in the excepti
38220 6f 6e 61 6c 0a 2a 2a 20 63 61 73 65 20 77 68 65  onal.** case whe
38230 72 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  re the page size
38240 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
38250 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
38260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
38270 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
38280 70 61 67 65 72 57 72 69 74 65 4c 61 72 67 65 53  pagerWriteLargeS
38290 65 63 74 6f 72 28 50 67 48 64 72 20 2a 70 50 67  ector(PgHdr *pPg
382a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
382b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
382c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
382d0 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61  de */.  Pgno nPa
382e0 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
382f0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
38300 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
38310 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
38320 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 31 3b 20   */.  Pgno pg1; 
38330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38340 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
38350 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
38360 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
38370 6f 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  on. */.  int nPa
38380 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
38390 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
383a0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
383b0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
383c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
383d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
383e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
383f0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
38400 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
38410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38420 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
38430 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
38440 5f 53 59 4e 43 20 2a 2f 0a 20 20 50 61 67 65 72  _SYNC */.  Pager
38450 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
38460 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 54 68 65  pPager;   /* The
38470 20 70 61 67 65 72 20 74 68 61 74 20 6f 77 6e 73   pager that owns
38480 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e   pPg */.  Pgno n
38490 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
384a0 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
384b0 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
384c0 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Size);..  /* Set
384d0 20 74 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   the doNotSpill 
384e0 4e 4f 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e  NOSYNC bit to 1.
384f0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
38500 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
38510 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
38520 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
38530 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
38540 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
38550 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   by.  ** this fu
38560 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  nction..  */.  a
38570 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
38580 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
38590 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
385a0 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
385b0 43 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  C)==0 );.  pPage
385c0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
385d0 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
385e0 43 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 74 72  C;..  /* This tr
385f0 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
38600 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
38610 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
38620 69 7a 65 20 61 72 65 0a 20 20 2a 2a 20 61 6e 20  ize are.  ** an 
38630 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
38640 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
38650 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
38660 69 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20  identifier.  ** 
38670 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
38680 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
38690 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
386a0 6e 2e 0a 20 20 2a 2f 0a 20 20 70 67 31 20 3d 20  n..  */.  pg1 = 
386b0 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
386c0 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
386d0 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 6e 50  r-1)) + 1;..  nP
386e0 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65  ageCount = pPage
386f0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 6