/ Hex Artifact Content
Login

Artifact 4343baff2f7e35f11988deb9c213870432ded1b1:


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 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 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: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 42 65 65 6e 55 73 65  .  u8 hasBeenUse
7920: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
7930: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 63 6f  * True if any co
7940: 6e 74 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79  ntent previously
7950: 20 72 65 61 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   read */.  Pgno 
7960: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7970: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7980: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7990: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
79a0: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
79b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
79c0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
79d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
79e0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
79f0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7a00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7a10: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7a20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7a30: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7a40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7a50: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7a60: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7a70: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7a80: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7a90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7aa0: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7ab0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7ac0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7ae0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7af0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7b00: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7b10: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7b30: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7b40: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7b50: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7b60: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7b80: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7b90: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7ba0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7bb0: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7bc0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7bd0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7be0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7bf0: 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  file */.#ifdef S
7c00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4e  QLITE_ENABLE_CON
7c10: 43 55 52 52 45 4e 54 0a 20 20 42 69 74 76 65 63  CURRENT.  Bitvec
7c20: 20 2a 70 41 6c 6c 52 65 61 64 3b 20 20 20 20 20   *pAllRead;     
7c30: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 72        /* Pages r
7c40: 65 61 64 20 77 69 74 68 69 6e 20 63 75 72 72 65  ead within curre
7c50: 6e 74 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72  nt CONCURRENT tr
7c60: 61 6e 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ans. */.#endif. 
7c70: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7c80: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7c90: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7ca0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7cb0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7cc0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7cd0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ce0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7cf0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7d00: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7d10: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7d20: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7d30: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7d40: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7d50: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7d60: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7d70: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7d80: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7d90: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7da0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7db0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7dc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7dd0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7de0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7df0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7e00: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7e10: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7e20: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7e30: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7e40: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7e50: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7e60: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7e80: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7e90: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7ea0: 74 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61  t[] */.  u32 iDa
7eb0: 74 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20  taVersion;      
7ec0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7ed0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7ee0: 65 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65  e content change
7ef0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  s */.  char dbFi
7f00: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
7f10: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
7f20: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
7f30: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
7f40: 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b  .  int nMmapOut;
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70  * Number of mmap
7f70: 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
7f80: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a   outstanding */.
7f90: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
7fa0: 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  szMmap;       /*
7fb0: 20 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d   Desired maximum
7fc0: 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20   mmap size */.  
7fd0: 50 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65  PgHdr *pMmapFree
7fe0: 6c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  list;       /* L
7ff0: 69 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70  ist of free mmap
8000: 20 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70   page headers (p
8010: 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20  Dirty) */.  /*. 
8020: 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72   ** End of the r
8030: 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e  outinely-changin
8040: 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a  g class members.
8050: 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    **************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
80a0: 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20    u16 nExtra;   
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
80c0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
80d0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
80e0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
80f0: 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20   i16 nReserve;  
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8110: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
8120: 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66   bytes at end of
8130: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
8140: 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20  u32 vfsFlags;   
8150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8160: 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
8170: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
8180: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
8190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
81a0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
81b0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
81c0: 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61  back */.  int pa
81d0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
81e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
81f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
8200: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
8210: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
8220: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
8230: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
8240: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
8250: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
8260: 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
8270: 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70  Size limit for p
8280: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
8290: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61  l files */.  cha
82a0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
82b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
82c0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
82d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
82e0: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
82f0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8300: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
8310: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  le */.  int (*xB
8320: 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
8330: 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  *); /* Function 
8340: 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73  to call when bus
8350: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  y */.  void *pBu
8360: 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20  syHandlerArg;   
8370: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
8380: 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79  gument for xBusy
8390: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74  Handler */.  int
83a0: 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20   aStat[3];      
83b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
83c0: 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69  l cache hits, mi
83d0: 73 73 65 73 20 61 6e 64 20 77 72 69 74 65 73 20  sses and writes 
83e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
83f0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61  _TEST.  int nRea
8400: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8410: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8420: 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65  pages read */.#e
8430: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
8440: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
8450: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
8460: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
8470: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
8480: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
8490: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
84a0: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
84b0: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
84c0: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
84d0: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
84e0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
84f0: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
8500: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
8510: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
8520: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
8530: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
8540: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
8550: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
8560: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
8570: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
8580: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
8590: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
85a0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
85b0: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
85c0: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
85d0: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
85e0: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
85f0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
8600: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
8610: 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50   */.  PCache *pP
8620: 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20  Cache;          
8630: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8640: 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63  page cache objec
8650: 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  t */.#ifndef SQL
8660: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57  ITE_OMIT_WAL.  W
8670: 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20  al *pWal;       
8680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
8690: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73  ite-ahead log us
86a0: 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ed by "journal_m
86b0: 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68  ode=wal" */.  ch
86c0: 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20  ar *zWal;       
86d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
86e0: 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65  e name for write
86f0: 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65  -ahead log */.#e
8700: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ndif.};../*.** I
8710: 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77  ndexes for use w
8720: 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b  ith Pager.aStat[
8730: 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74  ]. The Pager.aSt
8740: 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  at[] array conta
8750: 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
8760: 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61  s accessed by pa
8770: 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53  ssing SQLITE_DBS
8780: 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c  TATUS_CACHE_HIT,
8790: 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20   CACHE_MISS .** 
87a0: 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74  or CACHE_WRITE t
87b0: 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61  o sqlite3_db_sta
87c0: 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tus()..*/.#defin
87d0: 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  e PAGER_STAT_HIT
87e0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
87f0: 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a  ER_STAT_MISS  1.
8800: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8810: 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a  AT_WRITE 2../*.*
8820: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8830: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8840: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8850: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8860: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8870: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8880: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8890: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
88a0: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
88b0: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
88c0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
88d0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
88e0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
88f0: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8900: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8910: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8920: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8930: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8940: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8950: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8960: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8970: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8980: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8990: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
89a0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
89b0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
89c0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
89d0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
89e0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
89f0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8a00: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8a10: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8a20: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8a30: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8a40: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8a50: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8a60: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8a70: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8a80: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8a90: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8aa0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8ab0: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8ac0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8ad0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8ae0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8af0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8b00: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8b10: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8b20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8b30: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8b40: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8b50: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8b60: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8b70: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8b80: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8b90: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8ba0: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8bb0: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8bc0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8be0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8bf0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8c00: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8c10: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8c20: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8c30: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8c40: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8c50: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8c60: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8c70: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8c80: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8c90: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8ca0: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8cb0: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8cc0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8cd0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8ce0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8cf0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8d00: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8d10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8d20: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8d30: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8d40: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8d50: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8d60: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8d70: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8d80: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8d90: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8da0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8db0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8dc0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8dd0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8de0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
8df0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
8e00: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
8e10: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
8e20: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
8e30: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
8e40: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
8e50: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
8e60: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
8e70: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8e80: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8e90: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8ea0: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8eb0: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
8ec0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
8ed0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
8ee0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
8ef0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
8f00: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
8f10: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8f20: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8f30: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8f40: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8f50: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8f60: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8f70: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8f80: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8f90: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8fa0: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8fb0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8fc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8fd0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8fe0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8ff0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9000: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
9010: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
9020: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
9030: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
9040: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
9050: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
9060: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
9070: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
9080: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
9090: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
90a0: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
90b0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
90c0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
90d0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
90e0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
90f0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
9100: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
9110: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
9120: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
9130: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
9140: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
9150: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
9160: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
9170: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
9180: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
9190: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
91a0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
91b0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
91c0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
91d0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
91e0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
91f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
9200: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
9210: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
9220: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
9230: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
9240: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9250: 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20   macro USEFETCH 
9260: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9270: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65  e allowed to use
9280: 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20   the xFetch and 
9290: 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65  xUnfetch.** inte
92a0: 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73  rfaces to access
92b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
92c0: 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65  ing memory-mappe
92d0: 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51  d I/O..*/.#if SQ
92e0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
92f0: 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53  ZE>0.# define US
9300: 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e  EFETCH(x) ((x)->
9310: 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65  bUseFetch).#else
9320: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9330: 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a  CH(x) 0.#endif..
9340: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
9350: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
9360: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
9370: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
9380: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
9390: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
93a0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
93b0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
93c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
93d0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
93e0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
93f0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
9400: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
9410: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
9420: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
9430: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
9440: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
9450: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
9460: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
9470: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
9480: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
9490: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
94a0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
94b0: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
94c0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
94d0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
94e0: 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52  ods!=0)../*.** R
94f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9500: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9510: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9520: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9530: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9540: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9550: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9560: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9570: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9580: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
9590: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
95a0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
95b0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
95c0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
95d0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
95e0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
95f0: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9600: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9610: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9620: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9630: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9640: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9650: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9660: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9670: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9680: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
9690: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
96a0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
96b0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
96c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
96d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
96e0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
96f0: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9700: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9710: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9720: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9730: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9750: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9760: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9770: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9780: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
9790: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
97a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
97b0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
97c0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
97d0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
97e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
97f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9800: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9810: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9820: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9830: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9840: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9850: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9860: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9870: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9880: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9890: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
98a0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
98b0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
98c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
98d0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
98e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
98f0: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9900: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9910: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9920: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9930: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9940: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9950: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9960: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9970: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9980: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9990: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
99a0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
99b0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
99c0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
99d0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
99e0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
99f0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9a00: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9a10: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9a20: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9a30: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9a40: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9a50: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9a60: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9a70: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9a80: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9a90: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
9aa0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9ab0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9ac0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
9ad0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
9ae0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9af0: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9b00: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9b10: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9b20: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9b30: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9b40: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9b50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9b60: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9b70: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9b80: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9b90: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9ba0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9bb0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9bc0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9bd0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9be0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9bf0: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9c00: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9c10: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9c20: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9c30: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9c40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9c50: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9c60: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9c70: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9c80: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9c90: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9ca0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9cb0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9cc0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9cd0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9ce0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9cf0: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9d00: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9d10: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9d30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9d40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9d50: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9d60: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9d70: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9d80: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9d90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9da0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9db0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9dc0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9dd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9de0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
9df0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
9e00: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
9e10: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
9e20: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
9e30: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
9e40: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
9e50: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e60: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9e70: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
9e80: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
9e90: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
9ea0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9eb0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
9ec0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
9ed0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
9ee0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
9ef0: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
9f00: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
9f10: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9f20: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9f30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9f40: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
9f50: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
9f60: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
9f70: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
9f80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9f90: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
9fa0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
9fb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9fc0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9fd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9fe0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9ff0: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a000: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a010: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
a020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a030: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a040: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
a050: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a060: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a070: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a080: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a090: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a0a0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
a0b0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a0c0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a0d0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a0e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a100: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a110: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a120: 69 67 53 69 7a 65 20 7c 7c 20 70 50 61 67 65 72  igSize || pPager
a130: 2d 3e 70 41 6c 6c 52 65 61 64 20 29 3b 0a 20 20  ->pAllRead );.  
a140: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a150: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a160: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
a170: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a180: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a190: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a1a0: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
a1b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a1c0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
a1d0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a1e0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a1f0: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a200: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a210: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a220: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a230: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a240: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a250: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a260: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a270: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a280: 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  /* It is possibl
a290: 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e 61  e that if journa
a2a0: 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65 20  l_mode=wal here 
a2b0: 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68 65  that neither the
a2c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
a2d0: 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68 65  nal file nor the
a2e0: 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f 70   WAL file are op
a2f0: 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  en. This happens
a300: 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20 20   during.        
a310: 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72  ** a rollback tr
a320: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
a330: 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75  witches from jou
a340: 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20  rnal_mode=off.  
a350: 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72        ** to jour
a360: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20  nal_mode=wal..  
a370: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a380: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a390: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
a3a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
a3b0: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a3c0: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d) .            
a3d0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a3e0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a3f0: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a400: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a410: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a420: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a430: 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
a440: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
a450: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a460: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a470: 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  bFileSize );.   
a480: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a490: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a4a0: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
a4b0: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
a4c0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a4d0: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a  R_WRITER_DBMOD:.
a4e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a4f0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a500: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a510: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a520: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a530: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a540: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a550: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a560: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a570: 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck>=EXCLUSIVE_LO
a580: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a590: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a5a0: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
a5b0: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a5c0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a5d0: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a5e0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a5f0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a600: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a610: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
a620: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a630: 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d  rigSize<=pPager-
a640: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a660: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a670: 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20 20  ER_FINISHED:.   
a680: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a690: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a6a0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a6b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a6c0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a6d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a6e0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a6f0: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
a700: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a710: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a720: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a730: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a740: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a750: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a760: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a770: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a780: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a790: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a7a0: 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20   PAGER_ERROR:.  
a7b0: 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73      /* There mus
a7c0: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
a7d0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  e outstanding re
a7e0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
a7f0: 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a 2a  ager if.      **
a800: 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e   in ERROR state.
a810: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 70   Otherwise the p
a820: 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ager should have
a830: 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64   already dropped
a840: 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74  .      ** back t
a850: 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  o OPEN state..  
a860: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
a870: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a880: 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
a890: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a8a0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
a8b0: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
a8c0: 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20 20  PCache)>0 );.   
a8d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
a8e0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
a8f0: 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e 44  dif /* ifndef ND
a900: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
a910: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f 2a  SQLITE_DEBUG ./*
a920: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
a930: 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e 20  nter to a human 
a940: 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67 20  readable string 
a950: 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66 66  in a static buff
a960: 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  er.** containing
a970: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
a980: 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
a990: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
a9a0: 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69 73  ment. This.** is
a9b0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
a9c0: 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62 75  used within debu
a9d0: 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ggers. For examp
a9e0: 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72 6e  le, as an altern
a9f0: 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72 69  ative.** to "pri
aa00: 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20 67  nt *pPager" in g
aa10: 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29 20  db:.**.** (gdb) 
aa20: 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72 69  printf "%s", pri
aa30: 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  nt_pager_state(p
aa40: 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69 63  Pager).*/.static
aa50: 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61 67   char *print_pag
aa60: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
aa70: 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  p){.  static cha
aa80: 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20  r zRet[1024];.. 
aa90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
aaa0: 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20  f(1024, zRet,.  
aab0: 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20      "Filename:  
aac0: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
aad0: 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20 20  "State:         
aae0: 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22  %s errCode=%d\n"
aaf0: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20  .      "Lock:   
ab00: 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20         %s\n".   
ab10: 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65     "Locking mode
ab20: 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  :  locking_mode=
ab30: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75  %s\n".      "Jou
ab40: 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72  rnal mode:  jour
ab50: 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  nal_mode=%s\n". 
ab60: 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73 74       "Backing st
ab70: 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64  ore: tempFile=%d
ab80: 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75   memDb=%d useJou
ab90: 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20  rnal=%d\n".     
aba0: 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20   "Journal:      
abb0: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64   journalOff=%lld
abc0: 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64   journalHdr=%lld
abd0: 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65 3a  \n".      "Size:
abe0: 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a 65            dbsize
abf0: 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d 25  =%d dbOrigSize=%
ac00: 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c  d dbFileSize=%d\
ac10: 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46  n".      , p->zF
ac20: 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20  ilename.      , 
ac30: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ac40: 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20  _OPEN           
ac50: 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20   ? "OPEN" :.    
ac60: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ac70: 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20 20  AGER_READER     
ac80: 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22 20       ? "READER" 
ac90: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
aca0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
acb0: 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57 52  R_LOCKED   ? "WR
acc0: 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20  ITER_LOCKED" :. 
acd0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ace0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
acf0: 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54 45  ACHEMOD ? "WRITE
ad00: 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20  R_CACHEMOD" :.  
ad10: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ad20: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
ad30: 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45 52  MOD    ? "WRITER
ad40: 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  _DBMOD" :.      
ad50: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
ad60: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
ad70: 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49 4e  ED ? "WRITER_FIN
ad80: 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20 20  ISHED" :.       
ad90: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ada0: 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20  R_ERROR         
adb0: 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22 3f    ? "ERROR" : "?
adc0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
add0: 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a  (int)p->errCode.
ade0: 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b        , p->eLock
adf0: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20  ==NO_LOCK       
ae00: 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a    ? "NO_LOCK" :.
ae10: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
ae20: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
ae30: 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20 3a    ? "RESERVED" :
ae40: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
ae50: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
ae60: 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45 22  K  ? "EXCLUSIVE"
ae70: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
ae80: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ae90: 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22 20       ? "SHARED" 
aea0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
aeb0: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
aec0: 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20      ? "UNKNOWN" 
aed0: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
aee0: 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65    , p->exclusive
aef0: 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69 76  Mode ? "exclusiv
af00: 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20  e" : "normal".  
af10: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
af20: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
af30: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
af40: 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20   ? "memory" :.  
af50: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
af60: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
af70: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
af80: 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20 20   ? "off" :.     
af90: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
afa0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
afb0: 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20  MODE_DELETE   ? 
afc0: 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20 20  "delete" :.     
afd0: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
afe0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aff0: 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f 20  MODE_PERSIST  ? 
b000: 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20 20  "persist" :.    
b010: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b020: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b030: 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 3f  LMODE_TRUNCATE ?
b040: 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20 20   "truncate" :.  
b050: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b060: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b070: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
b080: 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72 72   ? "wal" : "?err
b090: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
b0a0: 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28  t)p->tempFile, (
b0b0: 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69  int)p->memDb, (i
b0c0: 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  nt)p->useJournal
b0d0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
b0e0: 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e  nalOff, p->journ
b0f0: 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28 69  alHdr.      , (i
b100: 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69  nt)p->dbSize, (i
b110: 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65  nt)p->dbOrigSize
b120: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65  , (int)p->dbFile
b130: 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74  Size.  );..  ret
b140: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
b150: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
b160: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
b170: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
b180: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
b190: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b1a0: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
b1b0: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
b1c0: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b1d0: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
b1e0: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
b1f0: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
b200: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
b210: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
b220: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
b230: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
b240: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
b250: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
b260: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
b270: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
b280: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
b290: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
b2a0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
b2b0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
b2c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
b2d0: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
b2e0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b2f0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b300: 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65 72  >pPager;.  Pager
b310: 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20  Savepoint *p;.  
b320: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
b330: 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a  >pgno;.  int i;.
b340: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b350: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b360: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
b370: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b380: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b390: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b3a0: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b3b0: 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e  cTestNotNull(p->
b3c0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
b3d0: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
b3e0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
b3f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b400: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b410: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
b420: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
b430: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
b440: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b460: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 61  pageInJournal(Pa
b470: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
b480: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
b490: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
b4a0: 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
b4b0: 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
b4c0: 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  no);.}.#endif../
b4d0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
b4e0: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
b4f0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b500: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
b510: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
b520: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
b530: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
b540: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
b550: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
b560: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
b570: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
b580: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
b590: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
b5a0: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
b5b0: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
b5c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
b5d0: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
b5e0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
b5f0: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
b600: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
b610: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
b620: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
b630: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
b640: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
b650: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b660: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
b670: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
b680: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
b690: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b6a0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
b6b0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
b6c0: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
b6d0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
b6e0: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
b6f0: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
b700: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
b710: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
b720: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b730: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b740: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
b750: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
b760: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
b770: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
b780: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
b790: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
b7a0: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
b7b0: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
b7c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
b7d0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
b7e0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
b7f0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
b800: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
b810: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
b820: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
b830: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
b840: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
b850: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
b860: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
b870: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b880: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
b890: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
b8a0: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
b8b0: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
b8c0: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
b8d0: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
b8e0: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
b8f0: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
b900: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
b910: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
b920: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
b930: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
b940: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
b950: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b960: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
b970: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
b980: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b990: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b9a0: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
b9b0: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
b9c0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
b9d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b9e0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
b9f0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
ba00: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
ba10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ba20: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
ba30: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
ba40: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
ba50: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
ba60: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
ba70: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
ba80: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
ba90: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
baa0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
bab0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
bac0: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
bad0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
bae0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
baf0: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
bb00: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50  k );.    rc = pP
bb10: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bb20: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bb30: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
bb40: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
bb50: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
bb60: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
bb70: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
bb80: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
bb90: 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eLock;.    }.   
bba0: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
bbb0: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
bbc0: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a  er, eLock)).  }.
bbd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bbe0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64  /*.** Lock the d
bbf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
bc00: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
bc10: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
bc20: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a  r SHARED_LOCK,.*
bc30: 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  * RESERVED_LOCK 
bc40: 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
bc50: 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  K. If the caller
bc60: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
bc70: 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  set the.** Pager
bc80: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
bc90: 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  to the new locki
bca0: 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a  ng state. .**.**
bcb0: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
bcc0: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
bcd0: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
bce0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
bcf0: 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c  n is .** called,
bd00: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
bd10: 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77  t unless the new
bd20: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69   locking state i
bd30: 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  s EXCLUSIVE_LOCK
bd40: 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f  . .** See the co
bd50: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
bd60: 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f  #define of UNKNO
bd70: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
bd80: 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f  xplanation .** o
bd90: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
bda0: 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44  c int pagerLockD
bdb0: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
bdc0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
bdd0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bde0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c  K;..  assert( eL
bdf0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
be00: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   || eLock==RESER
be10: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  VED_LOCK || eLoc
be20: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
be30: 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
be40: 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c  r->eLock<eLock |
be50: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
be60: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
be70: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
be80: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
be90: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
bea0: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
beb0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
bec0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
bed0: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
bee0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
bef0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bf00: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
bf10: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
bf20: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
bf30: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
bf40: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
bf50: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
bf60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
bf70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
bf80: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
bf90: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
bfa0: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
bfb0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
bfc0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
bfd0: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
bfe0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
bff0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
c000: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
c010: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
c020: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
c030: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
c040: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
c050: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
c060: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
c070: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
c080: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
c090: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c0a0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
c0b0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
c0c0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
c0d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
c0e0: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
c0f0: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
c100: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
c110: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
c120: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
c130: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
c140: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
c150: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
c160: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
c170: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
c180: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
c190: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
c1a0: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
c1b0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
c1c0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
c1d0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c1e0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
c1f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c200: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
c210: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
c220: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
c230: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
c240: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c250: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
c260: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
c270: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
c280: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
c290: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
c2a0: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
c2b0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
c2c0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2e0: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
c2f0: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
c300: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c320: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
c330: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
c340: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c350: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
c360: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
c370: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
c380: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
c390: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
c3a0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c3b0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
c3c0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
c3d0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c3e0: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
c3f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c400: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
c410: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
c420: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
c430: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c440: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
c450: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
c460: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
c470: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c480: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
c490: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
c4a0: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
c4b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
c4c0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
c4d0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c4e0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
c4f0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
c500: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
c510: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c520: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
c530: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
c540: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
c550: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
c560: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
c570: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
c580: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
c590: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
c5a0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
c5b0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c5c0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
c5d0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
c5e0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
c5f0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
c600: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
c610: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
c620: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c630: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
c640: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
c650: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
c660: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
c670: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
c680: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
c690: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
c6a0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
c6b0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
c6c0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
c6d0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
c6e0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
c6f0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
c700: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
c710: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
c720: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
c730: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
c740: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
c750: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
c760: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c770: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
c780: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
c790: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
c7a0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
c7b0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
c7c0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
c7d0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
c7e0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
c7f0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
c800: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
c810: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
c820: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
c830: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
c840: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
c850: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
c860: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
c870: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
c880: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
c890: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
c8a0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
c8b0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
c8c0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
c8d0: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
c8e0: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
c8f0: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
c900: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
c910: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
c920: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
c930: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
c940: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
c950: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
c960: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
c970: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
c980: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
c990: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
c9a0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
c9b0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
c9c0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c9d0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
c9e0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
c9f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ca00: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
ca10: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
ca20: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ca30: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
ca40: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
ca50: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
ca60: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
ca70: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
ca80: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
ca90: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
caa0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
cab0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
cac0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
cad0: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
cae0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
caf0: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
cb00: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
cb10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
cb20: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
cb30: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
cb40: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
cb50: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
cb60: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
cb70: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
cb80: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
cb90: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
cba0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
cbb0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
cbc0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
cbd0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
cbe0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
cbf0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cc00: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
cc10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cc20: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
cc30: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
cc40: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
cc50: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
cc60: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
cc70: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
cc80: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
cc90: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
cca0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
ccb0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
ccc0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
ccd0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
cce0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
ccf0: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
cd00: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
cd10: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
cd20: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
cd30: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
cd40: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
cd50: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
cd60: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
cd70: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
cd80: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
cd90: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
cda0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
cdb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
cdc0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
cdd0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
cde0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
cdf0: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
ce00: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
ce10: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
ce20: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
ce30: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
ce40: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
ce50: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
ce60: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
ce70: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
ce80: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
ce90: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
cea0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
ceb0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
cec0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
ced0: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
cee0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
cf00: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
cf10: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
cf20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
cf30: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
cf40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cf50: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
cf60: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
cf70: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
cf80: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
cf90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
cfa0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
cfb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cfc0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
cfd0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
cfe0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
cff0: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
d000: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
d010: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
d020: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
d030: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
d040: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
d050: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
d060: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
d070: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
d080: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
d090: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d0a0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
d0b0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
d0c0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
d0d0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d0e0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d0f0: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
d100: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
d110: 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20     || len==0 .  
d120: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d130: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d140: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
d150: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
d160: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d170: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d180: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
d190: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
d1a0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
d1b0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
d1c0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d1d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
d1e0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
d1f0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
d200: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
d210: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
d220: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
d230: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
d240: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d250: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
d260: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
d270: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
d280: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
d290: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
d2a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
d2b0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
d2c0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
d2d0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
d2e0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
d2f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d300: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d310: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
d320: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
d330: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
d340: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
d350: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
d360: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
d370: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
d380: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
d390: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
d3a0: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
d3b0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
d3c0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
d3d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d3e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d3f0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
d400: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
d410: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
d420: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
d430: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
d440: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d450: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
d460: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
d470: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
d480: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
d490: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
d4a0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
d4b0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
d4c0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
d4d0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
d4e0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
d510: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
d520: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
d530: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
d540: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
d550: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d570: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
d5a0: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
d5b0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
d5c0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
d5d0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
d5e0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
d5f0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
d600: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
d610: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
d620: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d630: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
d640: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
d650: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
d660: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
d670: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
d680: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d690: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
d6a0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
d6b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d6c0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
d6d0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
d6e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d6f0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d700: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d710: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
d720: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d730: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
d740: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d750: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
d760: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
d770: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
d780: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
d790: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
d7a0: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
d7b0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
d7c0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
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 76 61 72 69 61 62 6c 65 20  eLimit variable 
d7f0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
d800: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
d810: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
d820: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d830: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
d840: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
d850: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
d860: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
d880: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
d890: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
d8a0: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
d8b0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
d8c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
d8d0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
d8e0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
d8f0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
d900: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
d910: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
d920: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
d930: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
d940: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
d950: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
d960: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
d970: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
d980: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
d990: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
d9a0: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
d9b0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
d9c0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
d9d0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
d9e0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
d9f0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
da00: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
da10: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
da20: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
da30: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
da40: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
da50: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
da60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
da70: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
da80: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
da90: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
daa0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
dab0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
dac0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
dad0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
dae0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
daf0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
db00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db30: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
db40: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
db50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
db60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
db70: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
db80: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
db90: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
dba0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
dbb0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
dbc0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
dbd0: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
dbe0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
dbf0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
dc00: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
dc10: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
dc20: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
dc30: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
dc40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
dc50: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
dc60: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
dc70: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
dc80: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
dc90: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
dca0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
dcb0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
dcc0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
dcd0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
dce0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
dcf0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dd00: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
dd10: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
dd20: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
dd30: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
dd40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
dd50: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
dd60: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
dd70: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
dd80: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
dd90: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
dda0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
ddb0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
ddc0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
ddd0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
dde0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
ddf0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
de00: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
de10: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
de20: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
de30: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
de40: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
de50: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
de60: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
de70: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
de80: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
de90: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
dea0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
deb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
dec0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
ded0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
dee0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
def0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
df00: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
df10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
df20: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
df30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
df40: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
df50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
df60: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
df70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
df80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
df90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
dfa0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
dfb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
dfc0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
dfd0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
dfe0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
dff0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
e000: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
e010: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
e020: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
e030: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
e040: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
e050: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
e060: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
e070: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
e080: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
e090: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
e0a0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
e0b0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
e0c0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
e0d0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
e0e0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
e0f0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
e100: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
e110: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
e120: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
e130: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
e140: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
e150: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
e160: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
e170: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
e180: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
e190: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
e1a0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
e1b0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
e1c0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
e1d0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e1e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e1f0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
e200: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
e210: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e220: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e230: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e240: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
e250: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
e260: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
e270: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
e280: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
e290: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
e2a0: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
e2b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
e2c0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
e2d0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
e2e0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
e2f0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
e320: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
e330: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e360: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e370: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e380: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
e390: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
e3a0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
e3b0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
e3c0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
e3d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
e3e0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
e3f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e400: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
e410: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
e420: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
e430: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
e440: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
e450: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
e460: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
e470: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e480: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
e490: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
e4a0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
e4b0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
e4c0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
e4d0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
e4e0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
e4f0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
e500: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
e510: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
e520: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e530: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e540: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e550: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e560: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e570: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e580: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e590: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e5a0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e5b0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e5c0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e5d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e5e0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e5f0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e600: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e610: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e620: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e630: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e640: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e650: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e660: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e670: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e680: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e690: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e6a0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e6b0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e6c0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e6d0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e6e0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e6f0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e700: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e710: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e720: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e730: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e740: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e750: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e760: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e770: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e780: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e790: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e7a0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e7b0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e7c0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e7d0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e7e0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e7f0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e800: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e810: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e820: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e830: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e840: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e850: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e860: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e870: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e880: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e890: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e8a0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e8b0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e8c0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e8d0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e8e0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e8f0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e900: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e910: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e920: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e930: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e940: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e950: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e960: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e970: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e980: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e990: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e9a0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e9b0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e9c0: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e9d0: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e9e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e9f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ea00: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
ea10: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
ea20: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
ea30: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
ea40: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
ea50: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
ea60: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
ea70: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
ea80: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ea90: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
eaa0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
eab0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
eac0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
ead0: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
eae0: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
eaf0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
eb00: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
eb10: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
eb20: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
eb30: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a  initializer */ .
eb40: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
eb50: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
eb60: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
eb70: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
eb80: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  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: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
ebc0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
ebd0: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
ebe0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
ebf0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ec00: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ec10: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
ec20: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
ec30: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
ec40: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
ec50: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
ec60: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ec70: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ec80: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
ec90: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
eca0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
ecb0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
ecc0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ecd0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ece0: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
ecf0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
ed00: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
ed10: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
ed20: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
ed30: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
ed40: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
ed50: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
ed60: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
ed70: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
ed80: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
ed90: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
eda0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
edb0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
edc0: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
edd0: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
ede0: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
edf0: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
ee00: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
ee10: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ee20: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
ee30: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
ee40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ee50: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
ee60: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
ee70: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
ee80: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
ee90: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
eea0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
eeb0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
eec0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
eed0: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
eee0: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
eef0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
ef00: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
ef10: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
ef20: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
ef30: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
ef40: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
ef50: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
ef60: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
ef70: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
ef80: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
ef90: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
efa0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
efb0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
efc0: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
efd0: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
efe0: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
eff0: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
f000: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
f010: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
f020: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
f030: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
f040: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
f050: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
f060: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
f070: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
f080: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
f090: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
f0a0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
f0b0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
f0c0: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
f0d0: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
f0e0: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
f0f0: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
f100: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
f110: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
f120: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
f130: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
f140: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
f150: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
f160: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
f170: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
f180: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
f190: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
f1a0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
f1b0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
f1c0: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
f1d0: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
f1e0: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
f1f0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
f200: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
f210: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
f220: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
f230: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
f240: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
f250: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
f260: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
f270: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f280: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
f290: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f2a0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
f2b0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
f2c0: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
f2d0: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
f2e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f2f0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
f300: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f310: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
f320: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
f330: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
f340: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f350: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
f360: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
f370: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
f380: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
f390: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
f3a0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
f3b0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
f3c0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
f3d0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
f3e0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
f3f0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
f400: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
f410: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
f420: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
f430: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
f440: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
f450: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
f460: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
f470: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
f480: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f490: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
f4a0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
f4b0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
f4c0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
f4d0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
f4e0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
f4f0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
f500: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
f510: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
f520: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
f530: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f540: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f550: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f560: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f570: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f580: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f590: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f5a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f5b0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f5c0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f5d0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f5e0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f5f0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f600: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f610: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f620: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f630: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f640: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f650: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f660: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f670: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f680: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f690: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f6a0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f6b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f6c0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f6d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f6f0: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f700: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f710: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f730: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f740: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f750: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f760: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f780: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f790: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f7a0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f7b0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f7c0: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f7d0: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f7e0: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f7f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f820: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f830: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f840: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f850: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f860: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f870: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f890: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f8a0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f8b0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f8c0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f8d0: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f8e0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f8f0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f900: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f910: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f920: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f930: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f940: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f950: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f960: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f970: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f980: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f990: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f9a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f9b0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f9c0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f9d0: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f9e0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f9f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
fa00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
fa10: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
fa20: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
fa30: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
fa40: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
fa50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
fa60: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
fa70: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
fa80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fa90: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
faa0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
fab0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
fac0: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
fad0: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
fae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
faf0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
fb00: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
fb10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
fb20: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fb30: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
fb40: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
fb50: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
fb60: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
fb70: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
fb80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fb90: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
fba0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
fbb0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
fbc0: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
fbd0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
fbe0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
fbf0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
fc00: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
fc10: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
fc20: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
fc30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fc40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
fc50: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
fc60: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
fc70: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
fc80: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
fc90: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
fca0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
fcb0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
fcc0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
fcd0: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
fce0: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
fcf0: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
fd00: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
fd10: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
fd20: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
fd30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fd40: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fd50: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
fd60: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
fd70: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fd80: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fd90: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fda0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
fdb0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
fdc0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fdd0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fde0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fdf0: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
fe00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
fe10: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
fe20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fe30: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
fe40: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
fe50: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
fe60: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
fe70: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
fe80: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
fe90: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
fea0: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
feb0: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
fec0: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
fed0: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
fee0: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
fef0: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
ff00: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
ff10: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
ff20: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
ff30: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
ff40: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
ff50: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
ff60: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
ff70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ff80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
ff90: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
ffa0: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
ffb0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ffc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
ffd0: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
ffe0: 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
fff0: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
10000 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
10010 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
10020 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
10030 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
10040 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
10050 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
10060 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
10070 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
10080 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
10090 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
100a0 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
100b0 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
100c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
100d0 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
100e0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
100f0 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
10100 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
10110 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
10120 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
10130 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
10140 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
10150 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
10160 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
10170 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
10180 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
10190 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
101a0 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
101b0 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
101c0 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
101d0 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
101e0 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
101f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
10200 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10220 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
10230 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
10240 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
10250 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
10260 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
10270 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
10280 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
10290 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
102a0 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
102b0 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
102c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
102d0 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
102e0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
102f0 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
10300 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
10310 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
10320 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
10330 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
10340 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
10350 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
10360 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
10370 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
10380 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
10390 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
103a0 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
103b0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
103c0 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
103d0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
103e0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
103f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
10400 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
10410 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
10420 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
10430 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
10440 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
10450 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
10460 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
10470 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
10480 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
10490 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
104a0 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
104b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
104c0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
104d0 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
104e0 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
104f0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
10500 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10510 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
10520 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
10530 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10540 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10550 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10560 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
10570 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
10580 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
10590 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
105a0 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
105b0 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
105c0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
105d0 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
105e0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
105f0 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
10600 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
10610 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
10620 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
10630 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10640 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10650 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10660 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
10670 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
10680 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
10690 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
106a0 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
106b0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
106c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
106d0 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
106e0 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
106f0 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
10700 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10710 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
10720 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
10730 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10740 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10750 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10760 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
10770 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
10780 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
10790 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
107a0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
107b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
107c0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
107d0 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
107e0 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
107f0 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
10800 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
10810 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
10820 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
10830 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10840 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10850 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10860 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10870 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10880 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10890 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
108a0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
108b0 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
108c0 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
108d0 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
108e0 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
108f0 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
10900 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
10910 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
10920 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
10930 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10940 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10950 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10960 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10970 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10980 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10990 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
109a0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
109b0 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
109c0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
109d0 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
109e0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
109f0 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
10a00 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
10a10 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10a20 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
10a30 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10a40 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10a50 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10a60 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10a90 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
10ac0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10ad0 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10b00 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
10b10 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10b20 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b40 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10b50 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10b60 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b80 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10b90 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10ba0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
10bb0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10bc0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10bd0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
10be0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
10bf0 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
10c00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10c10 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10c20 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
10c30 20 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50     || !isOpen(pP
10c40 61 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a  ager->jfd).  ){.
10c50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10c60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10c70 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10c80 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  1;.  assert( pPa
10c90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
10ca0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
10cb0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10cc0 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10cd0 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10ce0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10cf0 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10d00 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10d10 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10d20 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10d30 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10d40 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10d50 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
10d60 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
10d70 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
10d80 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
10d90 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
10da0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10db0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10dc0 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
10dd0 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
10de0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
10df0 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
10e00 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
10e10 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
10e20 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
10e30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e40 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
10e50 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
10e60 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
10e70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10e80 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
10e90 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10ea0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
10eb0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
10ec0 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
10ed0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10ee0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10ef0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
10f00 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
10f10 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
10f20 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
10f30 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
10f40 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
10f50 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
10f60 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10f70 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10f80 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
10f90 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
10fa0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
10fb0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10fc0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10fd0 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10fe0 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
10ff0 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11000 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11010 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11020 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
11030 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
11040 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
11050 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11060 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
11070 69 63 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20  ic, 8,.         
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11090 20 20 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b          iHdrOff+
110a0 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
110b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
110c0 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
110d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
110e0 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
110f0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
11100 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
11110 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
11120 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
11130 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
11140 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
11150 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
11160 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
11170 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
11180 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
11190 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
111a0 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
111b0 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
111c0 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
111d0 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
111e0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
111f0 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
11200 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
11210 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
11220 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
11230 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
11240 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
11250 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
11260 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
11270 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
11280 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
11290 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
112a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
112b0 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
112c0 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
112d0 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
112e0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
112f0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11300 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
11310 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
11320 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
11330 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
11340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11350 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
11360 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11370 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
11380 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11390 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
113a0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
113b0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
113c0 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
113d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
113e0 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
113f0 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65  pPager){.  pPage
11400 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
11410 2b 3b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  +;.  sqlite3Back
11420 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
11430 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
11440 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
11450 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11460 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
11470 72 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69  rn the pPager->i
11480 44 61 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75  DataVersion valu
11490 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  e.*/.u32 sqlite3
114a0 50 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e  PagerDataVersion
114b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
114c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
114d0 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
114e0 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e  OPEN );.  return
114f0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11500 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsion;.}../*.** 
11510 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
11520 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
11530 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
11540 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
11550 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
11560 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
11570 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
11580 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
11590 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
115a0 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
115b0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
115c0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
115d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
115e0 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
115f0 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
11600 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11620 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
11630 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
11640 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
11650 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
11660 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
11670 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
11680 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11690 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
116a0 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
116b0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
116c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
116d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
116e0 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
116f0 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  al(pPager->sjfd)
11700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
11710 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
11720 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
11730 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
11740 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
11750 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11760 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
11770 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
11780 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  ;.  pPager->nSub
11790 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rec = 0;.}../*.*
117a0 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75  * Set the bit nu
117b0 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65  mber pgno in the
117c0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
117d0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  pInSavepoint .**
117e0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20   bitvecs of all 
117f0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
11800 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
11810 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  K if successful.
11820 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
11830 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
11840 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a  ailure occurs..*
11850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
11860 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
11870 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
11880 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
11890 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
118a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
118b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
118c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
118d0 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
118e0 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f  lt code */..  fo
118f0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11900 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11910 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
11920 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
11930 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11940 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
11950 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
11960 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c  .      rc |= sql
11970 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d  ite3BitvecSet(p-
11980 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
11990 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gno);.      test
119a0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
119b0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
119c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
119d0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
119e0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
119f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11a00 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
11a10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4e 43  LITE_ENABLE_CONC
11a20 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 49 66 20  URRENT./*.** If 
11a30 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c 72  they are not alr
11a40 65 61 64 79 2c 20 62 65 67 69 6e 20 72 65 63 6f  eady, begin reco
11a50 72 64 69 6e 67 20 61 6c 6c 20 70 61 67 65 73 20  rding all pages 
11a60 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
11a70 67 65 72 20 6c 61 79 65 72 0a 2a 2a 20 62 79 20  ger layer.** by 
11a80 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
11a90 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
11aa0 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
11ab0 73 61 63 74 69 6f 6e 73 2e 20 52 65 74 75 72 6e  sactions. Return
11ac0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  .** SQLITE_OK if
11ad0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
11ae0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
11af0 63 6f 64 65 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  code (SQLITE_NOM
11b00 45 4d 29 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  EM) if an error.
11b10 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
11b20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
11b30 67 69 6e 43 6f 6e 63 75 72 72 65 6e 74 28 50 61  ginConcurrent(Pa
11b40 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11b50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11b60 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
11b70 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d 30 20 29 7b  ->pAllRead==0 ){
11b80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
11b90 6c 52 65 61 64 20 3d 20 73 71 6c 69 74 65 33 42  lRead = sqlite3B
11ba0 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
11bb0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
11bc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
11bd0 6c 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lRead==0 ){.    
11be0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11bf0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
11c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11c10 2a 0a 2a 2a 20 53 74 6f 70 20 72 65 63 6f 72 64  *.** Stop record
11c20 69 6e 67 20 61 6c 6c 20 70 61 67 65 73 20 72 65  ing all pages re
11c30 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
11c40 72 20 6c 61 79 65 72 20 62 79 20 74 68 65 20 62  r layer by the b
11c50 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 61  -tree layer.** a
11c60 6e 64 20 64 69 73 63 61 72 64 20 61 6e 79 20 63  nd discard any c
11c70 75 72 72 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a  urrent records..
11c80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
11c90 61 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e  agerEndConcurren
11ca0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
11cb0 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
11cc0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11cd0 3e 70 41 6c 6c 52 65 61 64 29 3b 0a 20 20 70 50  >pAllRead);.  pP
11ce0 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d  ager->pAllRead =
11cf0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
11d00 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
11d10 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 77  database is in w
11d20 61 6c 20 6d 6f 64 65 2e 20 46 61 6c 73 65 20 6f  al mode. False o
11d30 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
11d40 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 57   sqlite3PagerIsW
11d50 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
11d60 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
11d70 65 72 2d 3e 70 57 61 6c 21 3d 30 3b 0a 7d 0a 23  er->pWal!=0;.}.#
11d80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  endif../*.** Fre
11d90 65 20 74 68 65 20 50 61 67 65 72 2e 70 49 6e 4a  e the Pager.pInJ
11da0 6f 75 72 6e 61 6c 20 61 6e 64 20 50 61 67 65 72  ournal and Pager
11db0 2e 70 41 6c 6c 52 65 61 64 20 62 69 74 76 65 63  .pAllRead bitvec
11dc0 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
11dd0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
11de0 65 65 42 69 74 76 65 63 73 28 50 61 67 65 72 20  eeBitvecs(Pager 
11df0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
11e00 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11e10 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
11e20 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
11e30 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
11e40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e    sqlite3PagerEn
11e50 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 50 61 67  dConcurrent(pPag
11e60 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  er);.}../*.** Th
11e70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11e80 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11e90 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11ea0 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
11eb0 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
11ec0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
11ed0 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
11ee0 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
11ef0 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
11f00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
11f10 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11f20 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
11f30 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
11f40 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11f50 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11f60 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11f70 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11f80 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11f90 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
11fa0 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
11fb0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
11fc0 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
11fd0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
11fe0 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
11ff0 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
12000 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
12010 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
12020 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12030 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
12040 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12050 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
12060 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
12070 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
12080 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
12090 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
120a0 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
120b0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
120c0 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
120d0 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
120e0 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
120f0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
12100 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
12110 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
12120 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
12130 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
12140 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
12150 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
12160 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
12170 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
12180 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
12190 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
121a0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
121b0 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
121c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
121d0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
121e0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
121f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
12200 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
12210 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12220 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
12230 20 20 70 61 67 65 72 46 72 65 65 42 69 74 76 65    pagerFreeBitve
12240 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  cs(pPager);.  re
12250 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
12260 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
12270 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
12280 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
12290 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
122a0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
122b0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
122c0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
122d0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
122e0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
122f0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12300 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
12310 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
12320 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
12350 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
12360 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
12370 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
12380 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
12390 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
123a0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
123b0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
123c0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
123d0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
123e0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
123f0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
12400 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
12410 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
12420 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
12430 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12440 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
12450 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
12460 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
12470 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
12480 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
12490 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
124a0 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
124b0 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
124c0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
124d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
124e0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
124f0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12500 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
12510 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
12520 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12530 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12540 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
12550 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12560 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12570 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
12580 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12590 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
125a0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
125b0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
125c0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
125d0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
125e0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
125f0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
12600 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
12610 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12620 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
12630 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12640 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
12650 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12660 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
12670 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12680 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
12690 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
126a0 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
126b0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
126c0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
126d0 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
126e0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
126f0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
12700 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
12710 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
12720 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
12730 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
12740 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
12750 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
12760 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
12770 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
12780 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
12790 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
127a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
127b0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
127c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
127d0 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
127e0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
127f0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
12800 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
12810 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
12820 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
12830 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
12840 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
12850 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
12860 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
12870 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
12880 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
12890 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
128a0 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
128b0 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
128c0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
128d0 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
128e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
128f0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12900 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12910 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12920 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12930 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12940 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12950 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12960 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12970 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12980 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12990 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
129a0 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
129b0 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
129c0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
129d0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
129e0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
129f0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12a00 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12a10 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
12a20 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
12a30 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12a40 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12a50 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12a60 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12a70 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12a80 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12a90 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
12aa0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12ab0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12ac0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12ad0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
12ae0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12af0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
12b00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12b10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12b20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
12b30 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33  Pager) ) sqlite3
12b40 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
12b50 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ->fd, 0, 0);.  }
12b60 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12b70 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
12b80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12b90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12ba0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
12bb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12bc0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
12bd0 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
12be0 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
12bf0 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
12c00 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
12c10 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
12c20 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
12c30 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
12c40 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
12c50 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
12c60 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
12c70 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
12c80 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
12c90 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
12ca0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
12cb0 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
12cc0 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
12cd0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
12ce0 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
12cf0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12d00 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
12d10 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
12d20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12d30 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
12d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
12d50 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
12d60 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
12d70 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
12d80 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12d90 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
12da0 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
12db0 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
12dc0 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
12dd0 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
12de0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
12df0 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
12e00 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
12e10 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
12e20 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
12e30 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  errCode..**.** T
12e40 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
12e50 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
12e60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12e70 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
12e80 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
12e90 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
12ea0 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
12eb0 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
12ec0 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
12ed0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12ee0 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
12ef0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
12f00 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
12f10 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
12f20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
12f30 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
12f40 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
12f50 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
12f60 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
12f70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12f90 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
12fa0 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
12fb0 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
12fc0 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
12fd0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
12fe0 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
12ff0 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
13000 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
13010 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
13020 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
13030 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
13040 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
13050 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
13060 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
13070 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
13080 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
13090 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
130a0 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
130b0 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
130c0 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
130d0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
130e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
130f0 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
13100 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
13110 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
13120 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
13130 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
13140 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
13150 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a  r, Pgno nPage);.
13160 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13170 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
13180 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61  action. A transa
13190 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79  ction is usually
131a0 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69   ended by .** ei
131b0 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72  ther a COMMIT or
131c0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72   a ROLLBACK oper
131d0 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74  ation. This rout
131e0 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ine may be calle
131f0 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c  d .** after roll
13200 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  back of a hot-jo
13210 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20  urnal, or if an 
13220 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
13230 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68  le opening.** th
13240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
13250 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65  r writing the ve
13260 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  ry first journal
13270 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20  -header of a.** 
13280 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
13290 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tion..** .** Thi
132a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
132b0 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47  er called in PAG
132c0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
132d0 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a  If it is called.
132e0 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45  ** in PAGER_NONE
132f0 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45 44   or PAGER_SHARED
13300 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c   state and the l
13310 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73  ock held is less
13320 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68  .** exclusive th
13330 61 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  an a RESERVED lo
13340 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ck, it is a no-o
13350 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  p..**.** Otherwi
13360 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
13370 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
13380 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
13390 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
133a0 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
133b0 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
133c0 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
133d0 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
133e0 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
133f0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
13400 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
13410 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
13420 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
13430 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
13440 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
13450 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
13460 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
13470 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13480 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
13490 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
134a0 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
134b0 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
134c0 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
134d0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
134e0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
134f0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
13500 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
13510 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
13520 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
13530 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
13540 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
13550 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
13560 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
13570 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
13580 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
13590 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
135a0 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
135b0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
135c0 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
135d0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
135e0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
135f0 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
13600 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
13610 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
13620 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
13630 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
13640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
13650 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
13660 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
13670 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
13680 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
13690 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
136a0 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
136b0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
136c0 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
136d0 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
136e0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
136f0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13700 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
13710 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
13720 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
13730 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
13740 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
13750 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
13760 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
13770 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
13780 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
13790 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
137a0 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
137b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
137c0 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
137d0 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
137e0 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
137f0 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
13800 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
13810 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
13820 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
13830 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
13840 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
13850 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
13860 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
13870 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
13880 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67  nalized, the pag
13890 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45  er moves to PAGE
138a0 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a  R_READER state..
138b0 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  ** If running in
138c0 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72   non-exclusive r
138d0 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68  ollback mode, th
138e0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  e lock on the fi
138f0 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72  le is .** downgr
13900 61 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44  aded to a SHARED
13910 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
13920 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
13930 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
13940 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
13950 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
13960 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49  .** any of the I
13970 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  O operations to 
13980 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
13990 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c  rnal file or unl
139a0 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ock the.** datab
139b0 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ase then the IO 
139c0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
139d0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
139e0 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f  er. If the .** o
139f0 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61  peration to fina
13a00 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
13a10 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65   file fails, the
13a20 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c  n the code still
13a30 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c  .** tries to unl
13a40 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
13a50 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20   file if not in 
13a60 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20  exclusive mode. 
13a70 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b  If the.** unlock
13a80 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73   operation fails
13a90 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74   as well, then t
13aa0 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63  he first error c
13ab0 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74  ode related.** t
13ac0 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  o the first erro
13ad0 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74  r encountered (t
13ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  he journal final
13af0 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a  ization one) is.
13b00 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
13b10 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
13b20 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
13b30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13b40 69 6e 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69  int hasMaster, i
13b50 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69  nt bCommit){.  i
13b60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13b70 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  K;      /* Error
13b80 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e   code from journ
13b90 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13ba0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
13bb0 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
13bc0 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  OK;     /* Error
13bd0 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69   code from db fi
13be0 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  le unlock operat
13bf0 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20  ion */..  /* Do 
13c00 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 70  nothing if the p
13c10 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
13c20 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
13c30 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
13c40 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20  * or at least a 
13c50 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54  RESERVED lock. T
13c60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
13c70 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
13c80 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
13c90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13ca0 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20 61 20  on active but a 
13cb0 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
13cc0 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a  ter lock is.  **
13cd0 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20   held under two 
13ce0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20  circumstances:. 
13cf0 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66   **.  **   1. Af
13d00 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c  ter a successful
13d10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
13d20 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c  lback, it is cal
13d30 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20  led with.  **   
13d40 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52     eState==PAGER
13d50 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d  _NONE and eLock=
13d60 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e  =EXCLUSIVE_LOCK.
13d70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
13d80 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  If a connection 
13d90 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  with locking_mod
13da0 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64  e=exclusive hold
13db0 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
13dc0 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b   .  **      lock
13dd0 20 73 77 69 74 63 68 65 73 20 62 61 63 6b 20 74   switches back t
13de0 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e  o locking_mode=n
13df0 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65  ormal and then e
13e00 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20  xecutes a.  **  
13e10 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63      read-transac
13e20 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74  tion, this funct
13e30 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ion is called wi
13e40 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52  th eState==PAGER
13e50 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20  _READER .  **   
13e60 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58     and eLock==EX
13e70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65  CLUSIVE_LOCK whe
13e80 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  n the read-trans
13e90 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64  action is closed
13ea0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13eb0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
13ec0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
13ed0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13ee0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
13ef0 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50  RROR );.  if( pP
13f00 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
13f10 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
13f20 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
13f30 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  k<RESERVED_LOCK 
13f40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13f50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
13f60 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
13f70 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ints(pPager);.  
13f80 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
13f90 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
13fa0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13fb0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
13fc0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
13fd0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
13fe0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
13ff0 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
14000 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   Finalize the jo
14010 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
14020 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
14030 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
14040 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
14050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14060 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14070 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14080 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20  MEMORY );.      
14090 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
140a0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
140b0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
140c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
140d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
140e0 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20  E_TRUNCATE ){.  
140f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14100 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
14110 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
14120 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
14130 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
14140 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
14150 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
14160 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
14170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14180 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  && pPager->fullS
14190 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
141a0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
141b0 65 20 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20  e new file size 
141c0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
141d0 74 68 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20  the inode right 
141e0 61 77 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20  away..          
141f0 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  ** Otherwise the
14200 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72   journal might r
14210 65 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69  esurrect followi
14220 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  ng a power loss 
14230 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
14240 20 63 61 75 73 65 20 74 68 65 20 6c 61 73 74 20   cause the last 
14250 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72  transaction to r
14260 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20  oll back.  See. 
14270 20 20 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70           ** http
14280 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a  s://bugzilla.moz
14290 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75  illa.org/show_bu
142a0 67 2e 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33  g.cgi?id=1072773
142b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
142c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
142d0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
142e0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
142f0 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
14300 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14310 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
14320 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
14330 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
14340 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14350 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14360 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c  _PERSIST.      |
14370 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
14380 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
14390 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
143a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
143b0 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20  DE_WAL).    ){. 
143c0 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
143d0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
143e0 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
143f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
14400 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
14410 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
14420 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62  his branch may b
14430 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20  e executed with 
14440 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
14450 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20  e==MEMORY if.   
14460 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72     ** a hot-jour
14470 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c  nal was just rol
14480 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69  led back. In thi
14490 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
144a0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  al.      ** file
144b0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
144c0 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49  d and deleted. I
144d0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
144e0 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20  n writes to.    
144f0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
14500 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20  e file, it will 
14510 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69  do so using an i
14520 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
14530 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
14540 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20    int bDelete = 
14550 28 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  (!pPager->tempFi
14560 6c 65 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75  le && sqlite3Jou
14570 72 6e 61 6c 45 78 69 73 74 73 28 70 50 61 67 65  rnalExists(pPage
14580 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20  r->jfd));.      
14590 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
145a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
145b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
145c0 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20  ELETE .         
145d0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
145e0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
145f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
14600 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  RY .           |
14610 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
14620 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14630 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
14640 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
14650 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
14660 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
14670 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20  if( bDelete ){. 
14680 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14690 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
146a0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
146b0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
146c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
146d0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
146e0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73  _CHECK_PAGES.  s
146f0 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
14700 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
14710 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
14720 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20  set_pagehash);. 
14730 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
14740 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  ize==0 && sqlite
14750 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
14760 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
14770 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
14780 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  *p = sqlite3Page
14790 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
147a0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  1);.    if( p ){
147b0 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61  .      p->pageHa
147c0 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  sh = 0;.      sq
147d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
147e0 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d  otNull(p);.    }
147f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
14800 61 67 65 72 46 72 65 65 42 69 74 76 65 63 73 28  agerFreeBitvecs(
14810 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
14820 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
14830 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
14840 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
14850 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  ache);.  sqlite3
14860 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
14870 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14880 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
14890 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
148a0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
148b0 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57     /* Drop the W
148c0 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69  AL write-lock, i
148d0 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20  f any. Also, if 
148e0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
148f0 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f  as in .    ** lo
14900 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
14910 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73  sive mode but is
14920 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70   no longer, drop
14930 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a   the EXCLUSIVE .
14940 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64      ** lock held
14950 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14960 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14970 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
14980 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61  alEndWriteTransa
14990 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
149a0 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  al);.    assert(
149b0 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
149c0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
149d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
149e0 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65  bCommit && pPage
149f0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50  r->dbFileSize>pP
14a00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
14a10 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
14a20 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
14a30 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
14a40 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c  ansaction in rol
14a50 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20  lback-journal.  
14a60 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65    ** mode if the
14a70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
14a80 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72  n disk is larger
14a90 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
14aa0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
14ab0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
14ac0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
14ad0 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e  een finalized an
14ae0 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
14af0 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73  n .    ** succes
14b00 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64  sfully committed
14b10 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53  , but the EXCLUS
14b20 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c  IVE lock is stil
14b30 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  l held on the.  
14b40 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74    ** file. So it
14b50 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e   is safe to trun
14b60 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
14b70 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69  e file to its mi
14b80 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71  nimum.    ** req
14b90 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a  uired size.  */.
14ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14bb0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
14bc0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
14bd0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
14be0 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
14bf0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
14c00 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
14c10 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69  ITE_OK && bCommi
14c20 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  t && isOpen(pPag
14c30 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72  er->fd) ){.    r
14c40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
14c50 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
14c60 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
14c70 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57  L_COMMIT_PHASETW
14c80 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  O, 0);.    if( r
14c90 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
14ca0 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
14cb0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
14cc0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
14cd0 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21  veMode .   && (!
14ce0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14cf0 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61  er) || sqlite3Wa
14d00 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
14d10 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29  Pager->pWal, 0))
14d20 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  .  ){.    rc2 = 
14d30 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
14d40 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
14d50 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
14d60 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
14d70 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
14d80 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
14d90 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67  R_READER;.  pPag
14da0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
14db0 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  0;..  return (rc
14dc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
14dd0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  rc);.}../*.** Ex
14de0 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
14df0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
14e00 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
14e10 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
14e20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a  atabase file. .*
14e30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14e40 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
14e50 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14e60 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74  state, do not at
14e70 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f  tempt .** the ro
14e80 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74  llback at this t
14e90 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61  ime. Instead, pa
14ea0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
14eb0 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63  called. The.** c
14ec0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14ed0 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61  ock() will disca
14ee0 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
14ef0 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a   pages, unlock.*
14f00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14f10 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ile and move the
14f20 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f   pager back to O
14f30 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68  PEN state. If th
14f40 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  is .** means tha
14f50 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  t there is a hot
14f60 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e  -journal left in
14f70 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
14f80 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63  , the next .** c
14f90 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74  onnection to obt
14fa0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
14fb0 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28  k on the pager (
14fc0 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69  which may be thi
14fd0 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20  s one) .** will 
14fe0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
14ff0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
15000 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
15010 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
15020 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  OR state, but an
15030 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
15040 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
15050 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
15060 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
15070 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
15080 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
15090 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74  ter the ERROR st
150a0 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
150b0 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
150c0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
150d0 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
150e0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
150f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15100 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
15110 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
15120 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
15130 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
15140 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67  ER_ERROR && pPag
15150 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
15160 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73  R_OPEN ){.    as
15170 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
15180 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
15190 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
151a0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
151b0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
151c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
151d0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
151e0 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
151f0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
15200 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
15210 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
15220 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
15230 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
15240 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
15250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15260 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
15270 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
15280 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74       pager_end_t
15290 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
152a0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, 0, 0);.    }.
152b0 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
152c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
152d0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
152e0 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
152f0 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
15300 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15310 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
15320 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
15330 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
15340 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
15350 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
15360 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
15370 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
15380 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
15390 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
153a0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
153b0 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
153c0 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
153d0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
153e0 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
153f0 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
15400 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
15410 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
15420 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
15430 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
15440 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
15450 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
15460 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
15470 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
15480 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
15490 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
154a0 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
154b0 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
154c0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
154d0 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
154e0 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
154f0 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
15500 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
15510 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
15520 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
15530 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
15540 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
15550 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
15560 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
15570 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
15580 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
15590 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
155a0 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
155b0 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
155c0 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
155d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
155e0 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
155f0 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
15600 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
15610 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
15620 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
15630 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
15640 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
15650 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
15660 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
15670 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
15680 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
15690 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
156a0 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
156b0 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
156c0 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
156d0 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
156e0 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
156f0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
15700 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
15710 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
15720 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15730 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
15740 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
15750 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
15760 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
15770 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
15780 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
15790 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
157a0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
157b0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
157c0 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
157d0 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
157e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
157f0 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
15800 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
15810 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15820 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15830 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
15840 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
15850 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
15860 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
15870 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15890 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
158a0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
158b0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
158c0 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
158d0 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
158e0 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
158f0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
15900 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
15910 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
15920 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
15930 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
15940 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
15950 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
15960 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
15970 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
15980 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
15990 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
159a0 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
159b0 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
159c0 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
159d0 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
159e0 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
159f0 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
15a00 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
15a10 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
15a20 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
15a30 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
15a40 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
15a50 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
15a60 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
15a70 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
15a80 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
15a90 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
15aa0 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
15ab0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15ac0 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
15ad0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
15ae0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
15af0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
15b00 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
15b10 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
15b20 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15b30 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
15b40 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
15b50 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
15b60 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
15b70 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
15b80 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
15b90 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
15ba0 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
15bb0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
15bc0 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
15bd0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
15be0 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
15bf0 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
15c00 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
15c10 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
15c20 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
15c30 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
15c40 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
15c50 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
15c60 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
15c70 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
15c80 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
15c90 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
15ca0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15cb0 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
15cc0 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
15cd0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
15ce0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
15cf0 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
15d00 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
15d10 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
15d20 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15d30 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
15d40 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
15d50 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
15d60 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
15d70 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
15d80 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
15d90 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
15da0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15db0 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
15dc0 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
15dd0 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
15de0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
15df0 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
15e00 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
15e10 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
15e20 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
15e30 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
15e40 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
15e50 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
15e60 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
15e70 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
15e80 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
15e90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
15ea0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
15eb0 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
15ec0 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
15ed0 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
15ee0 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
15ef0 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
15f00 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
15f10 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
15f20 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
15f30 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
15f40 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
15f50 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
15f60 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
15f70 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
15f80 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
15f90 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
15fa0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
15fb0 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
15fc0 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
15fd0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
15fe0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
15ff0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
16000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16010 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
16020 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
16030 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
16040 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
16050 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
16060 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
16070 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
16080 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
16090 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
160a0 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
160b0 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
160c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
160d0 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
160e0 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
160f0 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
16100 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
16110 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
16120 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
16130 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
16140 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
16170 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16180 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
16190 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
161c0 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
161d0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
161e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
161f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16200 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
16210 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
16220 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
16250 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
16260 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
16270 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
16280 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
16290 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
162a0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
162b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
162c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
162d0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
162e0 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
162f0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
16300 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
16310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16320 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
16330 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
16340 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
16350 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
16360 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
16370 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
16380 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
16390 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
163a0 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
163b0 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
163c0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
163d0 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
163e0 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
163f0 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
16400 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
16410 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
16420 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
16430 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
16440 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
16450 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
16460 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
16470 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
16480 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
16490 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
164a0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
164b0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
164c0 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
164d0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
164e0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
164f0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
16500 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
16510 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
16520 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
16530 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
16540 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
16550 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
16560 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
16570 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
16580 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
16590 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
165a0 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
165b0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
165c0 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
165d0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
165e0 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
165f0 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
16600 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
16610 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
16620 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
16630 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
16640 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
16650 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
16660 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
16670 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16680 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
16690 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
166a0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
166b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
166c0 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
166d0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
166e0 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
166f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16700 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
16710 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
16720 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
16730 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
16740 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
16750 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
16760 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
16770 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
16780 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
16790 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
167a0 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
167b0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
167c0 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
167d0 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
167e0 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
167f0 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
16800 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
16810 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
16820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16830 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
16840 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
16850 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
16860 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
16870 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
16880 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
16890 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
168a0 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
168b0 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
168c0 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
168d0 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
168e0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
168f0 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
16900 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
16910 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
16920 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
16930 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
16940 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
16950 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
16960 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
16970 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
16980 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
16990 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
169a0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
169b0 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
169c0 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
169d0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
169e0 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
169f0 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
16a00 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
16a10 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
16a20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
16a30 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
16a40 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
16a50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16a60 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
16a70 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
16a80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
16a90 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
16aa0 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
16ab0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16ac0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16ad0 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
16ae0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
16af0 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
16b00 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
16b10 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
16b20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
16b30 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
16b40 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
16b50 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
16b60 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
16b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16b80 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
16b90 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
16ba0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16bb0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65  n played back be
16bc0 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
16bd0 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
16be0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
16bf0 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
16c00 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
16c10 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
16c20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
16c30 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
16c40 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
16c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
16c60 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
16c70 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
16c80 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72  k page 1, restor
16c90 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  e the nReserve s
16ca0 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66  etting.  */.  if
16cb0 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ( pgno==1 && pPa
16cc0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28  ger->nReserve!=(
16cd0 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20  (u8*)aData)[20] 
16ce0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
16cf0 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29  Reserve = ((u8*)
16d00 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20  aData)[20];.    
16d10 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
16d20 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
16d30 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
16d40 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73  is in CACHEMOD s
16d50 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
16d60 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
16d70 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
16d80 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
16d90 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
16da0 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
16db0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
16dc0 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
16dd0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
16de0 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
16df0 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
16e00 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
16e10 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
16e20 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
16e30 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
16e40 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
16e50 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
16e60 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
16e70 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
16e80 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
16e90 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
16ea0 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
16eb0 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
16ec0 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
16ed0 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
16ee0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
16ef0 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
16f00 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
16f10 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
16f20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
16f30 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
16f40 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
16f50 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
16f60 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
16f70 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
16f80 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
16f90 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c  in WRITER_DBMOD,
16fa0 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
16fb0 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
16fc0 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
16fd0 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61  he.  ** pager ca
16fe0 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
16ff0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
17000 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
17010 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a  then marked .  *
17020 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e  * not dirty. Sin
17030 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ce this code is 
17040 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e  only executed in
17050 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
17060 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74  e for.  ** a hot
17070 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
17080 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  k, it is guarant
17090 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  eed that the pag
170a0 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e-cache is empty
170b0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67  .  ** if the pag
170c0 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74  er is in OPEN st
170d0 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
170e0 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
170f0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
17100 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
17110 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
17120 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
17130 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
17140 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
17150 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17160 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
17170 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
17180 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
17190 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
171a0 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
171b0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
171c0 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
171d0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
171e0 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
171f0 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
17200 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
17210 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
17220 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
17230 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
17240 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
17250 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
17260 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17270 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
17280 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
17290 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
172a0 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
172b0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
172c0 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
172d0 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
172e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
172f0 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
17300 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
17310 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
17320 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
17330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
17340 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
17350 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
17360 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
17370 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
17380 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
17390 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
173a0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
173b0 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
173c0 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
173d0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
173e0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
173f0 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
17400 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
17410 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
17420 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
17430 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
17440 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
17450 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
17460 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
17470 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
17480 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
17490 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
174a0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
174b0 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
174c0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
174d0 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
174e0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
174f0 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
17500 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
17510 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
17520 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
17530 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
17540 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
17550 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
17560 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
17570 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
17580 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  se{.    pPg = sq
17590 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
175a0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
175b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
175c0 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
175d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
175e0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
175f0 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b  PEN || pPg==0 );
17600 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
17610 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
17620 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
17630 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
17640 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
17650 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
17660 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
17670 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44  ageSize, (u8*)aD
17680 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
17690 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
176a0 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
176b0 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
176c0 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
176d0 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  l ){.    isSynce
176e0 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  d = pPager->noSy
176f0 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20  nc || (*pOffset 
17700 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
17710 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  alHdr);.  }else{
17720 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
17730 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
17740 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
17750 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20  R_NEED_SYNC));. 
17760 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28   }.  if( isOpen(
17770 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
17780 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
17790 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
177a0 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
177b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
177c0 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e  PEN).   && isSyn
177d0 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ced.  ){.    i64
177e0 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
177f0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
17800 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74  geSize;.    test
17810 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74  case( !isSavepnt
17820 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70   && pPg!=0 && (p
17830 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
17840 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b  NEED_SYNC)!=0 );
17850 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
17860 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17870 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
17880 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
17890 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61  ger->fd, (u8 *)a
178a0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
178b0 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20  geSize, ofst);. 
178c0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
178d0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
178e0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
178f0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
17900 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  o;.    }.    if(
17910 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
17920 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31   ){.      CODEC1
17930 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
17940 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
17950 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20  TE_NOMEM);.     
17960 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
17970 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
17980 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
17990 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43  )aData);.      C
179a0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44  ODEC2(pPager, aD
179b0 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63  ata, pgno, 7, rc
179c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61  =SQLITE_NOMEM, a
179d0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
179e0 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
179f0 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
17a00 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
17a10 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
17a20 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
17a30 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
17a40 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
17a50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
17a60 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
17a70 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
17a80 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
17a90 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
17aa0 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
17ab0 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
17ac0 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
17ad0 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
17ae0 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
17af0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
17b00 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
17b10 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
17b20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
17b30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
17b40 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
17b50 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
17b60 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
17b70 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
17b80 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
17b90 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
17ba0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
17bb0 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
17bc0 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
17bd0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
17be0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
17bf0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
17c00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
17c10 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
17c20 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
17c30 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
17c40 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
17c50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17c60 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
17c70 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
17c80 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
17c90 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
17ca0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
17cb0 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
17cc0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
17cd0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
17ce0 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
17cf0 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
17d00 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
17d10 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
17d20 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
17d30 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
17d40 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
17d50 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
17d60 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
17d70 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
17d80 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nt );.    assert
17d90 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
17da0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
17db0 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29  G_ROLLBACK)==0 )
17dc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
17dd0 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
17de0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  LFLAG_ROLLBACK;.
17df0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17e00 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61  PagerAcquire(pPa
17e10 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c  ger, pgno, &pPg,
17e20 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
17e30 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
17e40 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
17e50 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b  _ROLLBACK)!=0 );
17e60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17e70 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c  otSpill &= ~SPIL
17e80 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  LFLAG_ROLLBACK;.
17e90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17ea0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17eb0 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
17ec0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
17ed0 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
17ee0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
17ef0 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
17f00 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
17f10 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17f20 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17f30 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
17f40 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
17f50 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
17f60 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
17f70 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
17f80 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
17f90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
17fa0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
17fb0 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
17fc0 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
17fd0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
17fe0 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
17ff0 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
18000 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
18010 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
18020 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
18030 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
18040 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
18050 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
18060 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
18070 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
18080 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
18090 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
180a0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
180b0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
180c0 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
180d0 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
180e0 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
180f0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
18100 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
18110 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
18120 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
18130 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
18140 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
18150 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
18160 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
18170 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
18180 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
18190 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
181a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
181b0 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
181c0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
181d0 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
181e0 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
181f0 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
18200 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
18210 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
18220 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
18230 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
18240 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
18250 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
18260 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
18270 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
18280 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
18290 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
182a0 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
182b0 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
182c0 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
182d0 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
182e0 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
182f0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
18300 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
18310 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
18320 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
18330 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
18340 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
18350 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
18360 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
18370 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
18380 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
18390 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
183a0 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
183b0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
183c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
183d0 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
183e0 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
183f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
18400 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
18410 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
18420 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
18430 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
18440 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
18450 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
18460 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
18470 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
18480 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
18490 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
184a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
184b0 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
184c0 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
184d0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
184e0 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
184f0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
18500 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
18510 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
18520 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
18530 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
18540 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
18550 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
18560 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
18570 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
18580 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
18590 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
185a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
185b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
185c0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
185d0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
185e0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
185f0 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
18600 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
18610 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
18620 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
18630 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
18640 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
18650 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
18660 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
18670 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
18680 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
18690 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
186a0 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
186b0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
186c0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
186d0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
186e0 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
186f0 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
18700 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
18710 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
18720 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18730 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
18740 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
18750 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
18760 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18770 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
18780 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
18790 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
187a0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
187b0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
187c0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
187d0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
187e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
187f0 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
18800 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
18810 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
18820 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
18830 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
18840 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18850 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
18860 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
18870 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
18880 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
18890 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
188a0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
188b0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
188c0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
188d0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
188e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
188f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18900 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
18910 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
18920 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
18930 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
18940 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
18950 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
18960 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
18970 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
18980 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
18990 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
189a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
189b0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
189c0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
189d0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
189e0 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
189f0 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
18a00 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
18a10 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
18a20 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
18a30 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
18a40 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
18a50 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
18a60 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
18a70 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
18a80 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
18a90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18aa0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
18ab0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
18ac0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
18ad0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
18ae0 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
18af0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
18b00 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
18b10 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18b20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
18b30 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
18b40 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
18b50 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
18b60 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18b70 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
18b80 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
18b90 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
18ba0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
18bb0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
18bc0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
18bd0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
18be0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
18bf0 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
18c00 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
18c10 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
18c20 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
18c30 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
18c40 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
18c50 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
18c60 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
18c70 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
18c80 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
18c90 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
18ca0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
18cb0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
18cc0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
18cd0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
18ce0 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
18cf0 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
18d00 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
18d10 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
18d20 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
18d30 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
18d40 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
18d50 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
18d60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
18d70 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
18d80 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
18d90 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
18da0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
18db0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
18dc0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
18dd0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
18de0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
18df0 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
18e00 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
18e10 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18e20 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
18e30 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
18e40 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
18e50 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
18e60 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
18e70 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
18e80 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
18e90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18ea0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
18eb0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
18ec0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
18ed0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18ee0 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18ef0 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18f00 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18f10 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18f20 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18f30 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18f40 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18f50 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18f60 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18f80 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18f90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
18fa0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
18fb0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
18fc0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18fd0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18fe0 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18ff0 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
19000 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
19010 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
19020 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
19030 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
19040 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
19050 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19060 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
19070 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
19080 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
19090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
190a0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
190b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
190c0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
190d0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
190e0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
190f0 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
19100 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
19110 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
19120 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
19130 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
19140 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
19150 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
19160 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
19170 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
19180 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
19190 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
191a0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
191b0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
191c0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
191d0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
191e0 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
191f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
19200 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
19210 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
19220 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
19230 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
19240 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
19250 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
19260 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
19270 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
19280 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
19290 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
192a0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
192b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
192c0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
192d0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
192e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
192f0 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
19300 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
19310 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19320 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
19330 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
19340 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
19350 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19360 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19370 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
19380 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
19390 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
193a0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
193b0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
193c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
193d0 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
193e0 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
193f0 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
19400 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
19410 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
19420 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
19430 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
19440 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
19450 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
19460 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
19470 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
19480 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
19490 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
194a0 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
194b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
194c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
194d0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
194e0 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
194f0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
19500 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
19510 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
19520 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
19530 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
19540 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
19550 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
19560 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19570 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
19580 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19590 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
195a0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
195b0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
195c0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
195d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
195e0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
195f0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
19600 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
19610 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19620 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19630 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
19640 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
19650 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
19660 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
19670 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
19680 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
19690 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
196a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
196b0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
196c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
196d0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
196e0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
196f0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
19700 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
19710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19720 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
19730 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19740 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
19750 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
19760 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
19770 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
19780 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19790 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
197a0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
197b0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
197c0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
197d0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
197e0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
197f0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
19800 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
19810 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
19820 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
19830 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
19840 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
19850 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
19860 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
19870 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
19880 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
19890 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
198a0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
198b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
198c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
198d0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
198e0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
198f0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19900 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19910 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19920 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19940 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19950 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19970 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19980 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19990 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
199a0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
199b0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
199c0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
199d0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
199e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
199f0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19a00 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19a10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19a20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19a30 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19a50 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19a60 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19a70 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
19a80 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
19a90 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
19aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
19ab0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
19ac0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
19ad0 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
19ae0 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
19af0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19b00 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19b10 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19b20 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19b30 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19b40 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19b50 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19b60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19b70 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19b80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
19b90 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
19ba0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
19bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
19bc0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
19bd0 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
19be0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
19bf0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19c00 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19c10 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19c20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19c30 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19c40 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19c50 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19c60 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19c70 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
19c80 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
19c90 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
19ca0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
19cb0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
19cc0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
19cd0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
19ce0 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
19cf0 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19d00 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19d10 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19d20 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19d30 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19d40 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19d50 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19d60 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19d70 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
19d80 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19d90 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
19da0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
19db0 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
19dc0 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
19dd0 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
19de0 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
19df0 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
19e00 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
19e10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
19e20 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
19e30 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
19e40 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
19e50 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
19e60 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
19e70 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
19e80 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
19e90 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
19ea0 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
19eb0 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
19ec0 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
19ed0 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
19ee0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
19ef0 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
19f00 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
19f10 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
19f20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
19f30 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
19f40 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
19f50 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
19f60 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
19f70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
19f80 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
19f90 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
19fa0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
19fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
19fc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19fd0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
19fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19ff0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
1a000 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a  ER_READER );.  .
1a010 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1a020 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20  ger->fd) .   && 
1a030 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1a040 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1a050 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1a060 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1a070 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  N) .  ){.    i64
1a080 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
1a090 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  wSize;.    int s
1a0a0 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
1a0b0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  pageSize;.    as
1a0c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1a0d0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
1a0e0 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f  OCK );.    /* TO
1a0f0 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
1a100 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
1a110 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
1a120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a130 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1a140 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
1a150 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
1a160 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29  e = szPage*(i64)
1a170 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
1a180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a190 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
1a1a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
1a1b0 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
1a1c0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
1a1d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
1a1e0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
1a1f0 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
1a200 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
1a210 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67  urrentSize+szPag
1a220 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  e)<=newSize ){. 
1a230 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d         char *pTm
1a240 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  p = pPager->pTmp
1a250 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d  Space;.        m
1a260 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73  emset(pTmp, 0, s
1a270 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  zPage);.        
1a280 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
1a290 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75  ze-szPage) == cu
1a2a0 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
1a2b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1a2c0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
1a2d0 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  >  currentSize )
1a2e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1a2f0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a300 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20  ager->fd, pTmp, 
1a310 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d  szPage, newSize-
1a320 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  szPage);.      }
1a330 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1a340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a350 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
1a360 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  leSize = nPage;.
1a370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a380 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a390 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1a3a0 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69   sanitized versi
1a3b0 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  on of the sector
1a3c0 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65  -size of OS file
1a3d0 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72   pFile. The.** r
1a3e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67  eturn value is g
1a3f0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65  uaranteed to lie
1a400 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20   between 32 and 
1a410 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1a420 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
1a430 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1a440 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1a450 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c    int iRet = sql
1a460 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1a470 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69  (pFile);.  if( i
1a480 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52  Ret<32 ){.    iR
1a490 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  et = 512;.  }els
1a4a0 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53  e if( iRet>MAX_S
1a4b0 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
1a4c0 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
1a4d0 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
1a4e0 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58  ;.    iRet = MAX
1a4f0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1a500 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b  }.  return iRet;
1a510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1a520 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
1a530 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1a540 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
1a550 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
1a560 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
1a570 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1a580 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
1a590 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
1a5a0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1a5b0 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
1a5c0 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
1a5d0 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e   .** to determin
1a5e0 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61  e the size and a
1a5f0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72  lignment of jour
1a600 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a  nal header and .
1a610 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1a620 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69  l pointers withi
1a630 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61  n created journa
1a640 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  l files..**.** F
1a650 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1a660 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  es the effective
1a670 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
1a680 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
1a690 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1a6a0 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f  e, for non-tempo
1a6b0 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
1a6c0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a6d0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20   size is.** the 
1a6e0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1a6f0 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
1a700 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64  e() method round
1a710 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a  ed up to 32 if.*
1a720 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  * it is less tha
1a730 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64  n 32, or rounded
1a740 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
1a750 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
1a760 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
1a770 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
1a780 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1a790 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c  file has the SQL
1a7a0 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1a7b0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72  AFE_OVERWRITE pr
1a7c0 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74  operty, then set
1a7d0 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76  .** the effectiv
1a7e0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f  e sector size to
1a7f0 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   its minimum val
1a800 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70  ue (512).  The p
1a810 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61  urpose of.** pPa
1a820 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1a830 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65  is to define the
1a840 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20   "blast radius" 
1a850 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a  of bytes that.**
1a860 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66   might change if
1a870 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
1a880 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
1a890 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1a8a0 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e  n.** that range.
1a8b0 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52    But with POWER
1a8c0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20  SAFE_OVERWRITE, 
1a8d0 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73  the blast radius
1a8e0 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61   is zero.** (tha
1a8f0 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53  t is what POWERS
1a900 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65  AFE_OVERWRITE me
1a910 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69  ans), so we mini
1a920 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a  mize the sector.
1a930 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61  ** size.  For ba
1a940 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
1a950 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c  ility of the rol
1a960 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
1a970 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65  le format,.** we
1a980 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74   cannot reduce t
1a990 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a9a0 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35  tor size below 5
1a9b0 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
1a9c0 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
1a9d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a9e0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1a9f0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1aa00 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1aa10 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  e );..  if( pPag
1aa20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20  er->tempFile.   
1aa30 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
1aa40 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1aa50 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26  cs(pPager->fd) &
1aa60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1aa70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1aa80 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1aa90 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
1aaa0 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
1aab0 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
1aac0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
1aad0 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
1aae0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
1aaf0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1ab00 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61  yet, in which ca
1ab10 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
1ab20 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
1ab30 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
1ab40 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1ab50 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
1ab60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ab70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1ab80 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f  e = sqlite3Secto
1ab90 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
1aba0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1abb0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
1abc0 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
1abd0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
1abe0 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
1abf0 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
1ac00 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
1ac10 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
1ac20 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
1ac30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1ac40 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
1ac50 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
1ac60 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
1ac70 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
1ac80 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
1ac90 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
1aca0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1acb0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1acc0 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
1acd0 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
1ace0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1acf0 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
1ad00 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1ad10 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
1ad20 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
1ad30 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
1ad40 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1ad50 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
1ad60 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1ad70 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1ad80 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
1ad90 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
1ada0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
1adb0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
1adc0 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
1add0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1ade0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
1adf0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
1ae00 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
1ae10 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
1ae20 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
1ae30 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1ae40 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1ae50 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1ae60 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
1ae70 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
1ae80 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
1ae90 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
1aea0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1aeb0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1aec0 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
1aed0 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
1aee0 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
1aef0 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
1af00 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
1af10 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
1af20 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
1af30 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
1af40 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
1af50 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
1af60 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
1af70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1af80 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
1af90 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
1afa0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
1afb0 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
1afc0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
1afd0 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
1afe0 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
1aff0 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
1b000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b010 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1b020 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
1b030 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
1b040 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
1b050 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
1b060 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
1b070 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
1b080 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
1b090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1b0a0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
1b0b0 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
1b0c0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
1b0d0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
1b0e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b0f0 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
1b100 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
1b110 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
1b120 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1b130 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
1b140 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
1b150 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
1b160 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1b170 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
1b180 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
1b190 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
1b1a0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
1b1b0 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
1b1c0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
1b1d0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
1b1e0 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
1b1f0 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
1b200 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1b210 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
1b220 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
1b230 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
1b240 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
1b250 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
1b260 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
1b270 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1b280 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
1b290 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
1b2a0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1b2b0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
1b2c0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
1b2d0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
1b2e0 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
1b2f0 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
1b300 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
1b310 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
1b320 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
1b330 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
1b340 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
1b350 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
1b360 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
1b370 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
1b380 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
1b390 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
1b3a0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
1b3b0 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
1b3c0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
1b3d0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1b3e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b3f0 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1b400 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1b410 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1b420 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1b430 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1b440 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1b450 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1b460 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1b470 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1b480 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1b490 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1b4a0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1b4b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1b4c0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1b4d0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1b4e0 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1b4f0 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1b500 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1b510 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1b520 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1b530 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1b540 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1b550 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1b560 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1b570 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1b580 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1b590 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1b5a0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1b5b0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1b5c0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1b5d0 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1b5e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1b5f0 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1b600 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1b610 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1b620 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1b630 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1b640 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1b650 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1b660 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1b670 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1b680 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1b690 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1b6a0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1b6b0 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1b6c0 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1b6d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1b6e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1b6f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1b700 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1b710 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1b720 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1b730 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1b740 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b750 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b760 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1b770 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1b780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b790 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1b7a0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1b7b0 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b7d0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1b7e0 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1b7f0 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1b800 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b810 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1b820 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1b830 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b840 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b850 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1b860 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b870 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1b880 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1b890 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1b8a0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1b8b0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1b8c0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1b8d0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1b8e0 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1b8f0 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1b900 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1b910 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1b920 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1b930 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1b940 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62   */.  int nPlayb
1b950 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ack = 0;       /
1b960 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1b970 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64  f pages restored
1b980 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
1b990 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1b9a0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1b9b0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1b9c0 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1b9d0 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1b9e0 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1b9f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1ba00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1ba10 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1ba20 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1ba30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1ba40 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1ba50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ba60 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ba70 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1ba80 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1ba90 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1baa0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1bab0 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1bac0 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1bad0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1bae0 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1baf0 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1bb00 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1bb10 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1bb20 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1bb30 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1bb40 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1bb50 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1bb60 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1bb70 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1bb80 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1bb90 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1bba0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1bbb0 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1bbc0 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1bbd0 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1bbe0 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1bbf0 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1bc00 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1bc10 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1bc20 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1bc30 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1bc40 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
1bc50 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1bc60 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1bc70 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1bc80 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1bc90 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1bca0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1bcb0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1bcc0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1bcd0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1bce0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1bcf0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1bd00 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1bd10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bd20 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1bd30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bd40 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1bd50 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1bd60 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1bd70 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1bd80 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1bd90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1bda0 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1bdb0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1bdc0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1bdd0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1bde0 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1bdf0 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1be00 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1be10 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1be20 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1be30 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1be40 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1be50 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1be60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1be70 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1be80 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1be90 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1bea0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1beb0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1bec0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bed0 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1bee0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1bef0 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1bf00 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1bf10 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1bf20 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1bf30 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1bf40 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1bf50 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1bf60 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1bf70 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1bf80 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1bf90 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1bfa0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1bfb0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1bfc0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1bfd0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1bfe0 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1bff0 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1c000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c010 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1c020 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1c030 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c040 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1c050 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c060 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1c070 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1c080 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1c090 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1c0a0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1c0b0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1c0c0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1c0d0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1c0e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1c0f0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1c100 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1c110 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1c120 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1c130 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1c140 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1c150 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1c160 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1c170 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1c180 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1c190 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1c1a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c1b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c1c0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1c1d0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1c1e0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1c1f0 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1c200 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1c210 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1c220 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1c230 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1c240 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1c250 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1c260 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1c270 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1c280 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1c290 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1c2a0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1c2b0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1c2c0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1c2d0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1c2e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1c2f0 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1c300 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1c310 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1c320 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1c330 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c340 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1c350 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1c360 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1c370 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c380 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1c390 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1c3a0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1c3b0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1c3c0 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1c3d0 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1c3e0 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1c3f0 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1c400 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1c410 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1c420 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1c430 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1c440 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1c450 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1c460 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1c470 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1c480 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1c490 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1c4a0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1c4b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1c4c0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1c4d0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1c4e0 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1c4f0 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1c500 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1c510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c520 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1c530 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1c540 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1c550 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1c560 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c570 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1c580 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1c590 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1c5a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c5b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1c5c0 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1c5d0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1c5e0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1c5f0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1c600 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1c610 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1c620 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1c630 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1c640 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1c650 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1c660 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1c670 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1c680 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1c690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c6a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c6b0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1c6c0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1c6d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c6e0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1c6f0 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1c700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c710 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c720 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c730 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c740 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1c750 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1c760 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1c770 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1c780 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1c790 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1c7a0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c7b0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1c7c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1c7d0 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1c7e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1c7f0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1c800 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1c810 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c820 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1c830 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1c840 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1c850 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1c860 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1c870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c880 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1c890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c8a0 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79  ){.        nPlay
1c8b0 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  back++;.      }e
1c8c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1c8d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c8f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c900 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1c910 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c920 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1c930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c940 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c950 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1c960 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1c970 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1c980 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1c990 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1c9a0 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1c9b0 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1c9c0 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1c9d0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1c9e0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1c9f0 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1ca00 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1ca10 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1ca20 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1ca30 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1ca40 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1ca50 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1ca60 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1ca70 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1ca80 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1ca90 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1caa0 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1cab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1cac0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cad0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1cae0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1caf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cb00 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1cb10 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1cb20 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1cb30 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1cb40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1cb50 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1cb60 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1cb70 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1cb80 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1cb90 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1cba0 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1cbb0 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1cbc0 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1cbd0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1cbe0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1cbf0 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1cc00 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1cc10 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1cc20 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1cc30 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cc40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cc50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1cc60 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1cc70 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1cc80 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1cc90 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1cca0 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1ccb0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1ccc0 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1ccd0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1cce0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1ccf0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1cd00 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1cd10 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1cd20 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1cd30 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1cd40 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1cd50 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1cd60 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1cd70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1cd80 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1cd90 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1cda0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1cdb0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1cdc0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1cdd0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1cde0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1cdf0 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1ce00 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1ce10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1ce20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1ce30 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1ce40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1ce50 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1ce60 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1ce70 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1ce80 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1ce90 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1cea0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1ceb0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1cec0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1ced0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1cee0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cef0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1cf00 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1cf10 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1cf20 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1cf30 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1cf40 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1cf50 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1cf60 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1cf70 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1cf80 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1cf90 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1cfa0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1cfb0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1cfc0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1cfd0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1cfe0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1cff0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1d000 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1d010 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1d020 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1d030 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1d040 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1d050 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1d060 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1d070 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1d080 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1d090 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1d0a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d0b0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1d0c0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1d0d0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1d0e0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1d0f0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1d100 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1d110 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1d120 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1d130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1d140 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1d150 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1d160 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1d170 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1d180 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1d190 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1d1a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1d1b0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1d1c0 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1d1d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d1e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1d1f0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1d200 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1d210 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1d220 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d240 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d250 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1d260 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1d270 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1d280 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1d290 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1d2a0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1d2b0 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1d2c0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1d2d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1d2e0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1d2f0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1d300 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1d310 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1d320 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1d330 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d340 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d350 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79  ( isHot && nPlay
1d360 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
1d370 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
1d380 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
1d390 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72  LLBACK, "recover
1d3a0 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d  ed %d pages from
1d3b0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1d3c0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c        nPlayback,
1d3d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d3e0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  l);.  }..  /* Th
1d3f0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1d400 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1d410 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1d420 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1d430 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1d440 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1d450 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1d460 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1d470 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1d480 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1d490 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1d4a0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1d4b0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1d4c0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1d4d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d4e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1d4f0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1d500 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1d510 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d520 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1d530 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1d540 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1d550 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1d560 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d570 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1d580 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d590 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1d5a0 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1d5b0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1d5c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1d5d0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1d5e0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1d5f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d600 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1d610 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1d620 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1d630 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d640 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1d650 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1d660 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d670 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1d680 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1d690 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69  gHdr *pPg, u32 i
1d6a0 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20  Frame){.  Pager 
1d6b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d6c0 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1d6d0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1d6e0 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1d6f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1d700 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1d710 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1d720 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1d730 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d740 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1d750 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1d760 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1d770 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1d780 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d790 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1d7a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1d7b0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1d7c0 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1d7d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1d7e0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1d7f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d800 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46  MIT_WAL.  if( iF
1d810 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rame ){.    /* T
1d820 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1d830 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1d840 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1d850 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d860 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1d870 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1d880 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  me, pgsz, pPg->p
1d890 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Data);.  }else.#
1d8a0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36  endif.  {.    i6
1d8b0 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1d8c0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1d8d0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1d8e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1d8f0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1d900 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1d910 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1d920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d930 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d940 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d950 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1d960 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1d970 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1d980 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1d990 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1d9a0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1d9b0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1d9c0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1d9d0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1d9e0 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1d9f0 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1da00 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1da10 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1da20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1da30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1da40 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1da50 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1da60 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1da70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1da80 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1da90 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1daa0 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1dab0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1dac0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1dad0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1dae0 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1daf0 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1db00 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1db10 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1db20 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1db30 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1db40 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1db50 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1db60 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1db70 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1db80 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1db90 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1dba0 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1dbb0 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1dbc0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1dbd0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1dbe0 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  se equaling 16 b
1dbf0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1dc00 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1dc10 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1dc20 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1dc30 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1dc40 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1dc50 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1dc60 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1dc70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1dc80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1dc90 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1dca0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1dcb0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1dcc0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1dcd0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1dce0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1dcf0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1dd00 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1dd10 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1dd20 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1dd30 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1dd40 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1dd50 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1dd60 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1dd70 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1dd80 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1dd90 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1dda0 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1ddb0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1ddc0 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1ddd0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1dde0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1de00 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1de10 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1de20 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1de30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1de40 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1de50 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1de60 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1de70 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1de80 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1de90 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1dea0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1deb0 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1dec0 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1ded0 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1dee0 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1def0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1df00 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1df10 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1df20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1df30 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1df40 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1df50 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1df60 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1df70 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1df80 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1df90 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1dfa0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1dfb0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1dfc0 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1dfd0 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1dfe0 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1dff0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1e000 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1e010 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1e020 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1e030 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1e040 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1e050 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1e060 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1e070 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1e080 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1e090 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1e0a0 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1e0b0 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1e0c0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1e0d0 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1e0e0 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1e0f0 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1e100 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1e110 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1e120 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1e130 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1e140 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1e150 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1e160 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1e170 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1e180 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1e190 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1e1a0 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1e1b0 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1e1c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1e1d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e1e0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1e1f0 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1e200 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1e210 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1e220 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1e230 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1e240 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1e250 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1e260 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1e270 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e280 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1e290 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1e2a0 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1e2b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e2c0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1e2d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1e2e0 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1e2f0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1e300 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1e310 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1e320 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1e330 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1e340 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1e350 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1e360 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1e370 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1e380 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1e390 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e3a0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1e3b0 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1e3c0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1e3d0 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1e3e0 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1e3f0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1e400 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1e410 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1e420 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1e430 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1e440 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1e450 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1e460 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e470 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1e480 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1e490 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1e4a0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1e4b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e4c0 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1e4d0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1e4e0 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1e4f0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1e500 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1e510 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1e520 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1e530 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1e540 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1e550 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
1e560 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1e570 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1e580 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e590 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1e5a0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
1e5b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e5d0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1e5e0 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1e5f0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1e600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e610 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1e620 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1e630 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e640 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1e650 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1e660 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1e670 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1e680 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1e690 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1e6a0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1e6b0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1e6c0 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1e6d0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1e6e0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1e6f0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1e700 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1e710 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1e720 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1e730 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1e740 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1e750 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1e760 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1e770 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1e780 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1e790 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1e7a0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e7b0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1e7c0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1e7d0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1e7e0 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1e7f0 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1e800 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1e810 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1e820 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1e830 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1e840 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1e850 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1e860 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1e870 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e880 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e890 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1e8a0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1e8b0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1e8c0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1e8d0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1e8e0 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1e8f0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e920 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1e930 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1e940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e950 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1e960 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1e970 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1e980 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1e990 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1e9a0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1e9b0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1e9c0 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1e9d0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1e9e0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1e9f0 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1ea00 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1ea10 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1ea20 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1ea30 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1ea40 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1ea50 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1ea60 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1ea70 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1ea80 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1ea90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1eaa0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1eab0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1eac0 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1ead0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1eae0 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1eaf0 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1eb00 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1eb10 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1eb20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1eb30 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1eb40 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74   an CONCURRENT t
1eb50 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1eb60 20 70 61 67 65 20 31 20 6d 75 73 74 20 62 65 20   page 1 must be 
1eb70 72 65 72 65 61 64 20 66 72 6f 6d 20 0a 20 20 2a  reread from .  *
1eb80 2a 20 74 68 65 20 64 62 20 66 69 6c 65 2c 20 65  * the db file, e
1eb90 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ven if it is not
1eba0 20 64 69 72 74 79 2e 20 54 68 69 73 20 69 73 20   dirty. This is 
1ebb0 62 65 63 61 75 73 65 20 74 68 65 20 62 2d 74 72  because the b-tr
1ebc0 65 65 20 6c 61 79 65 72 20 0a 20 20 2a 2a 20 6d  ee layer .  ** m
1ebd0 61 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ay have already 
1ebe0 7a 65 72 6f 65 64 20 74 68 65 20 6e 46 72 65 65  zeroed the nFree
1ebf0 20 61 6e 64 20 69 54 72 75 6e 6b 20 68 65 61 64   and iTrunk head
1ec00 65 72 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 23  er fields.  */.#
1ec10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ec20 42 4c 45 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  BLE_CONCURRENT. 
1ec30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ec40 4f 4b 20 26 26 20 28 70 4c 69 73 74 3d 3d 30 20  OK && (pList==0 
1ec50 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 21 3d  || pList->pgno!=
1ec60 31 29 20 26 26 20 70 50 61 67 65 72 2d 3e 70 41  1) && pPager->pA
1ec70 6c 6c 52 65 61 64 20 29 7b 0a 20 20 20 20 72 63  llRead ){.    rc
1ec80 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1ec90 62 61 63 6b 28 28 76 6f 69 64 2a 29 70 50 61 67  back((void*)pPag
1eca0 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 23 65 6e 64  er, 1);.  }.#end
1ecb0 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  if..  while( pLi
1ecc0 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
1ecd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
1ece0 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
1ecf0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20  >pDirty;.    rc 
1ed00 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  = pagerUndoCallb
1ed10 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67  ack((void *)pPag
1ed20 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
1ed30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  ;.    pList = pN
1ed40 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
1ed50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ed60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ed70 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
1ed80 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  d sqlite3WalFram
1ed90 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73  es(). As well as
1eda0 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20   logging.** the 
1edb0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1edc0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65  list of pages he
1edd0 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63  aded by pList (c
1ede0 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
1edf0 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ty),.** this fun
1ee00 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61  ction notifies a
1ee10 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70  ny active backup
1ee20 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20   processes that 
1ee30 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a  the pages have.*
1ee40 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a  * changed. .**.*
1ee50 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61  * The list of pa
1ee60 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ges passed into 
1ee70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ee80 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79  always sorted by
1ee90 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1eea0 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20   Hence, if page 
1eeb0 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65  1 appears anywhe
1eec0 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20  re on the list, 
1eed0 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66  it will be the f
1eee0 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73  irst page..*/ .s
1eef0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57  tatic int pagerW
1ef00 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65  alFrames(.  Page
1ef10 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1ef30 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1ef40 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20   PgHdr *pList,  
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d   /* List of fram
1ef70 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50  es to log */.  P
1ef80 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20  gno nTruncate,  
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1efa0 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1efb0 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69  after this commi
1efc0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  t */.  int isCom
1efd0 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1efe0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1eff0 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d  f this is a comm
1f000 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  it */.){.  int r
1f010 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f030 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1f040 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20  nt nList;       
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f060 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1f070 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20  s in pList */.  
1f080 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1f0b0 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20  ver pages */..  
1f0c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f0d0 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1f0e0 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1f0f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1f100 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1f110 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1f120 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1f130 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1f140 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1f150 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1f160 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1f170 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1f180 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1f190 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1f1a0 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  t( pList->pDirty
1f1b0 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20  ==0 || isCommit 
1f1c0 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69  );.  if( isCommi
1f1d0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  t ){.    /* If a
1f1e0 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1f1f0 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
1f200 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
1f210 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e   point in writin
1f220 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67  g.    ** any pag
1f230 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
1f240 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
1f250 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f  n nTruncate into
1f260 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20   the WAL file.. 
1f270 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20     ** They will 
1f280 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79  never be read by
1f290 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20   any client. So 
1f2a0 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
1f2b0 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20   the pDirty.    
1f2c0 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f  ** list here. */
1f2d0 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e  .    PgHdr **ppN
1f2e0 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20  ext = &pList;.  
1f2f0 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    nList = 0;.   
1f300 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a   for(p=pList; (*
1f310 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20  ppNext = p)!=0; 
1f320 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f330 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1f340 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  =nTruncate ){.  
1f350 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26        ppNext = &
1f360 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  p->pDirty;.     
1f370 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20     nList++;.    
1f380 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1f390 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1f3a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73   }else{.    nLis
1f3b0 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 1;.  }.  pPa
1f3c0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
1f3d0 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20  _STAT_WRITE] += 
1f3e0 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c  nList;..  if( pL
1f3f0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1f400 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1f410 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1f420 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1f430 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1f440 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1f450 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1f460 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1f470 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67  , isCommit, pPag
1f480 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
1f490 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1f4a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1f4b0 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
1f4c0 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1f4d0 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1f4e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1f4f0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1f500 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1f510 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1f520 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1f530 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f540 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1f550 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1f560 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1f570 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1f580 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1f590 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1f5a0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1f5b0 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1f5c0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1f5d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1f5e0 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1f5f0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1f600 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f610 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1f620 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1f630 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1f640 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1f650 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1f660 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1f670 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1f680 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1f690 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1f6a0 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1f6b0 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1f6c0 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1f6d0 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1f6e0 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1f6f0 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1f700 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1f710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f720 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1f730 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1f740 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f770 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1f780 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f7a0 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1f7b0 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1f7c0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1f7d0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1f7e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f7f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1f800 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1f810 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f820 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1f830 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f840 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1f850 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1f860 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1f870 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1f880 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1f890 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1f8a0 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1f8b0 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1f8c0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1f8d0 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1f8e0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1f8f0 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1f900 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1f910 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1f920 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1f930 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1f940 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f950 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1f960 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1f970 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1f980 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1f990 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f9a0 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1f9b0 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1f9c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1f9d0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
1f9e0 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
1f9f0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
1fa00 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
1fa10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1fa20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1fa30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1fa40 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  led as part of t
1fa50 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72  he transition fr
1fa60 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  om PAGER_OPEN.**
1fa70 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
1fa80 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d   state to determ
1fa90 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ine the size of 
1faa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fab0 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61  e.** in pages (a
1fac0 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65  ssuming the page
1fad0 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20   size currently 
1fae0 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
1faf0 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a  pageSize)..**.**
1fb00 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
1fb10 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
1fb20 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1fb30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1fb40 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61  atabase.** in pa
1fb50 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ges is stored in
1fb60 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77   *pnPage. Otherw
1fb70 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
1fb80 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53  de (perhaps.** S
1fb90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1fba0 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  T) is returned a
1fbb0 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
1fbc0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  ft unmodified..*
1fbd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1fbe0 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
1fbf0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1fc00 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
1fc10 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1fc30 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1fc40 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1fc50 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41   /* Query the WA
1fc60 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72  L sub-system for
1fc70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1fc80 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a  ze. The WalDbsiz
1fc90 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  e().  ** functio
1fca0 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69  n returns zero i
1fcb0 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
1fcc0 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65   open (i.e. Page
1fcd0 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20  r.pWal==0), or. 
1fce0 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62   ** if the datab
1fcf0 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ase size is not 
1fd00 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64  available. The d
1fd10 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1fd20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  not.  ** availab
1fd30 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1fd40 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68  sub-system if th
1fd50 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d  e log file is em
1fd60 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74  pty or.  ** cont
1fd70 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f  ains no valid co
1fd80 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
1fd90 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
1fda0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1fdb0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1fdc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1fdd0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1fde0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61  ED_LOCK );.  nPa
1fdf0 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44  ge = sqlite3WalD
1fe00 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
1fe10 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  al);..  /* If th
1fe20 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1fe30 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1fe40 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1fe50 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  le from the.  **
1fe60 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c   WAL sub-system,
1fe70 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
1fe80 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65 64  age counte based
1fe90 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a   on the size of.
1fea0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1feb0 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  e file.  If the 
1fec0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1fed0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1fee0 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72   an.  ** integer
1fef0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1ff00 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e   page-size, roun
1ff10 64 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e  d up the result.
1ff20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1ff30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20  e==0 ){.    i64 
1ff40 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
1ff50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ff60 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
1ff70 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73  bytes */.    ass
1ff80 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1ff90 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1ffa0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1ffb0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1ffc0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1ffd0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1ffe0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1fff0 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20  ager->fd, &n);. 
20000 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20010 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20030 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
20040 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Page = (Pgno)((n
20050 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
20060 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70  e-1) / pPager->p
20070 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
20080 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
20090 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
200a0 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
200b0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
200c0 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
200d0 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
200e0 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
200f0 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
20100 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
20110 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
20120 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
20130 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
20140 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
20150 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
20160 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
20170 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
20180 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
20190 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
201a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
201b0 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
201c0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
201d0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
201e0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
201f0 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
20200 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
20210 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20220 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
20230 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
20240 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
20250 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
20260 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
20270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20280 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
20290 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
202a0 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
202b0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
202c0 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
202d0 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
202e0 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
202f0 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
20300 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
20310 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
20320 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
20330 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
20340 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
20350 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
20360 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
20370 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
20380 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20390 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
203a0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
203b0 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
203c0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
203d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
203e0 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
203f0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
20400 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
20410 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
20420 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
20430 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
20440 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
20450 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
20460 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
20470 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
20480 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
20490 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
204a0 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
204b0 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
204c0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
204d0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
204e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
204f0 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
20500 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
20510 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
20520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20530 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20540 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
20550 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
20560 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
20570 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
20580 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
20590 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
205a0 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205c0 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
205d0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50   exists */.    P
205e0 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20600 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  Size of the data
20610 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
20620 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
20630 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
20640 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
20650 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20660 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
20670 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20680 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
20690 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
206a0 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  er->zWal, 0);.  
206b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
206c0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
206d0 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c  NOENT ) rc = SQL
206e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73  ITE_OK;.      is
206f0 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Wal = 0;.    }el
20700 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
20710 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
20720 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
20730 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
20740 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
20750 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57  ESS_EXISTS, &isW
20760 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  al.      );.    
20770 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
20780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20790 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20   if( isWal ){.  
207a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
207b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
207c0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
207d0 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
207e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
207f0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
20800 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
20810 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
20820 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
20830 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20840 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
20850 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20860 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
20870 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
20880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20890 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
208a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
208b0 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
208c0 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
208d0 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
208e0 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
208f0 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
20900 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
20910 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
20920 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
20930 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
20940 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
20950 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
20960 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
20970 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
20980 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
20990 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
209a0 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
209b0 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
209c0 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
209d0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
209e0 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
209f0 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
20a00 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
20a10 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
20a20 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
20a30 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
20a40 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
20a50 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
20a60 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
20a70 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
20a80 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
20a90 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
20aa0 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
20ab0 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
20ac0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
20ad0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20ae0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20af0 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
20b00 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20b10 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
20b20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
20b30 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
20b40 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
20b50 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
20b60 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
20b70 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
20b80 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
20b90 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
20ba0 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
20bb0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
20bc0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
20bd0 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
20be0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20bf0 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
20c00 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20c10 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
20c20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
20c30 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
20c40 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
20c50 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
20c60 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
20c70 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
20c80 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
20c90 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
20ca0 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
20cb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
20cc0 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
20cd0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
20ce0 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
20cf0 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
20d00 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
20d10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
20d20 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
20d30 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
20d40 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
20d50 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
20d60 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
20d70 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
20d80 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
20d90 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
20da0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
20db0 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
20dc0 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
20dd0 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
20de0 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
20df0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
20e00 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
20e10 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20e20 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
20e30 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
20e40 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
20e50 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
20e60 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
20e70 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
20e80 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
20e90 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
20ea0 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
20eb0 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
20ec0 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
20ed0 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
20ee0 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
20ef0 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
20f00 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
20f10 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
20f20 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
20f30 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
20f40 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
20f50 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
20f60 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
20f70 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
20f80 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
20f90 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
20fa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20fb0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
20fc0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
20fd0 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
20fe0 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
20ff0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
21000 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
21010 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
21020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
21030 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
21040 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
21050 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
21060 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21070 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
21080 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
21090 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
210a0 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
210b0 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
210c0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
210d0 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
210e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
210f0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
21100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21110 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
21120 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
21130 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
21140 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
21150 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
21160 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
21170 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
21180 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
21190 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
211a0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
211b0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
211c0 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
211d0 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
211e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
211f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21200 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
21210 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
21220 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
21230 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
21240 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
21250 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
21260 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
21270 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
21280 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
21290 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
212a0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
212b0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
212c0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
212d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
212e0 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
212f0 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
21300 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21310 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
21320 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
21330 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
21340 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21350 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
21360 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
21370 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
21380 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
21390 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
213a0 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
213b0 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
213c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
213d0 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
213e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
213f0 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
21400 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
21410 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21420 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
21430 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
21440 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
21450 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
21460 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
21470 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
21480 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
21490 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
214a0 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
214b0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
214c0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
214d0 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
214e0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
214f0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
21500 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
21510 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
21520 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
21530 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
21540 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
21550 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
21560 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
21570 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
21580 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
21590 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
215a0 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
215b0 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
215c0 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
215d0 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
215e0 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
215f0 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
21600 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
21610 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
21620 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
21630 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
21640 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
21650 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
21660 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
21670 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
21680 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
21690 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
216a0 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
216b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
216c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
216d0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
216e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
216f0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
21700 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
21710 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
21720 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
21730 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21740 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
21760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21770 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
21780 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
21790 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
217a0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
217b0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
217c0 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
217d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
217e0 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
217f0 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
21800 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
21810 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21820 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
21830 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
21840 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
21850 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
21860 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
21870 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
21880 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
21890 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
218a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
218b0 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
218c0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
218d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
218e0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
218f0 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
21900 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
21910 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
21920 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
21930 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
21940 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
21950 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
21960 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
21970 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21980 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
21990 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
219a0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
219b0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
219c0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
219d0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
219e0 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
219f0 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
21a00 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
21a10 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
21a20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
21a30 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
21a40 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
21a50 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
21a60 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
21a70 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
21a80 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21a90 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21aa0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21ab0 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
21ac0 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
21ad0 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
21ae0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
21af0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
21b00 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
21b10 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
21b20 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
21b30 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
21b40 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
21b50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
21b60 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
21b70 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
21b80 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
21b90 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
21ba0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21bb0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21bc0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
21bd0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21be0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
21bf0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
21c00 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
21c10 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
21c20 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
21c30 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
21c40 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
21c50 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
21c60 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
21c70 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
21c80 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
21c90 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
21ca0 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
21cb0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
21cc0 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
21cd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
21ce0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
21cf0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21d00 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21d10 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
21d20 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
21d30 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
21d40 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
21d50 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
21d60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21d70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21d80 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
21d90 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
21da0 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
21db0 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
21dc0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
21dd0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
21de0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21df0 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
21e00 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
21e10 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
21e20 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
21e30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21e40 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
21e50 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
21e60 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21e70 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
21e80 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
21e90 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21ea0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
21eb0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
21ec0 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
21ed0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21ee0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
21ef0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
21f00 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
21f10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
21f20 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21f30 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
21f40 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
21f50 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
21f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21f70 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
21f80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
21f90 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
21fa0 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
21fb0 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
21fc0 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
21fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
21fe0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
21ff0 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e  AP_SIZE based on
22000 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
22010 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f  ue of szMmap..*/
22020 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
22030 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61  erFixMaplimit(Pa
22040 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
22050 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
22060 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74  P_SIZE>0.  sqlit
22070 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
22080 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20  ager->fd;.  if( 
22090 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64  isOpen(fd) && fd
220a0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
220b0 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73  sion>=3 ){.    s
220c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
220d0 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72  .    sz = pPager
220e0 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50  ->szMmap;.    pP
220f0 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20  ager->bUseFetch 
22100 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71  = (sz>0);.    sq
22110 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
22120 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
22130 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
22140 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
22150 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
22160 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22170 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
22180 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
22190 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
221a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
221b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
221c0 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
221d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
221e0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
221f0 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
22200 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
22210 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
22220 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
22230 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
22240 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
22250 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
22260 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
22270 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
22280 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22290 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
222a0 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
222b0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
222c0 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
222d0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
222e0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
222f0 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
22300 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
22310 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
22320 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22330 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
22340 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
22350 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
22360 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
22370 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
22380 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
22390 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
223a0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
223b0 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
223c0 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
223d0 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
223e0 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
223f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
22400 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
22410 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
22420 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
22430 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
22440 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
22450 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
22460 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
22470 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
22480 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22490 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
224a0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
224b0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
224c0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
224d0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
224e0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
224f0 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
22500 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
22510 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
22520 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
22530 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
22540 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22550 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
22560 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
22570 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
22580 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
22590 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
225a0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
225b0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
225c0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
225e0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
225f0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
22600 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
22610 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
22620 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
22630 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
22640 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
22650 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
22660 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
22670 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
22680 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
22690 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
226a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
226b0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
226c0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
226d0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
226e0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
226f0 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
22700 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
22710 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
22720 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
22730 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
22740 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
22750 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
22760 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
22770 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
22780 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
22790 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
227a0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
227b0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
227c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
227d0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
227e0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
227f0 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
22800 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
22810 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
22820 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
22830 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
22840 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
22850 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
22860 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
22870 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
22880 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
22890 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
228a0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
228b0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
228c0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
228d0 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
228e0 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
228f0 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
22900 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
22910 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
22920 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
22930 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
22940 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
22950 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
22960 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
22970 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
22980 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
22990 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
229a0 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
229b0 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
229c0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
229d0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
229e0 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
229f0 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a  ed with NORMAL..
22a00 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
22a10 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
22a20 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
22a30 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
22a40 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
22a50 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
22a60 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
22a70 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
22a80 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
22a90 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
22aa0 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
22ab0 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
22ac0 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
22ad0 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
22ae0 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
22af0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
22b00 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
22b10 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
22b20 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
22b30 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
22b40 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
22b50 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
22b60 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
22b70 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
22b80 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
22b90 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
22ba0 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
22bb0 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
22bc0 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
22bd0 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
22be0 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
22bf0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22c00 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
22c10 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
22c20 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
22c30 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
22c40 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
22c50 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
22c60 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
22c70 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
22c80 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
22c90 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73  e pager to set s
22ca0 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20  afety level for 
22cb0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
22cc0 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61  Flags      /* Va
22cd0 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29  rious flags */.)
22ce0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76  {.  unsigned lev
22cf0 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50  el = pgFlags & P
22d00 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22d10 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28  _MASK;.  assert(
22d20 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76   level>=1 && lev
22d30 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65  el<=3 );.  pPage
22d40 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
22d50 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
22d60 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
22d70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
22d80 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
22d90 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
22da0 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69  pFile) ?1:0;.  i
22db0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
22dc0 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22dd0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
22de0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22df0 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
22e00 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
22e10 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
22e20 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
22e30 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22e40 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22e50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22e60 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22e70 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22e80 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
22e90 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
22ea0 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
22eb0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22ec0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22ed0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
22ee0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22ef0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22f00 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
22f10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22f20 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22f30 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
22f40 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22f50 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22f60 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
22f70 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
22f80 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
22f90 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
22fa0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
22fb0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
22fc0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
22fd0 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
22fe0 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
22ff0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
23000 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
23010 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
23020 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
23030 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
23040 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23050 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
23060 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
23070 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
23080 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23090 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
230a0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
230b0 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
230c0 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
230d0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
230e0 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
230f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
23100 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
23110 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
23120 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
23130 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
23140 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
23150 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
23160 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
23170 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23180 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
23190 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
231a0 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
231b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
231c0 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
231d0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
231e0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
231f0 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
23200 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
23210 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
23220 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
23230 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
23240 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
23250 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
23260 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
23270 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
23280 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
23290 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
232a0 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
232b0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
232c0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
232d0 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
232e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
232f0 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
23300 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
23310 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
23320 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23330 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
23340 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
23350 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
23360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23370 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
23380 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
23390 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
233a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
233b0 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
233c0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
233d0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
233e0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
233f0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
23400 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
23410 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23420 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
23430 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
23440 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
23450 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
23460 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
23470 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
23480 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
23490 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
234a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
234b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
234c0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
234d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
234e0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
234f0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23500 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
23510 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
23520 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
23530 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
23540 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
23550 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
23560 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
23570 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23580 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
23590 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
235a0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
235b0 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
235c0 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
235d0 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
235e0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
235f0 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
23600 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
23610 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
23620 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
23630 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
23640 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
23650 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
23660 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
23670 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
23680 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
23690 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
236a0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
236b0 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
236c0 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
236d0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
236e0 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
236f0 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
23700 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
23710 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
23720 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
23730 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23750 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
23760 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
23770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
237b0 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
237c0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
237d0 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
237e0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
237f0 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
23800 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
23810 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
23820 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
23830 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
23840 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
23850 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
23860 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
23870 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
23880 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
23890 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
238a0 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
238b0 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
238c0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
238d0 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
238e0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
238f0 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
23900 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
23910 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23920 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
23930 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
23940 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
23950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23960 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
23970 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
23980 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
23990 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
239a0 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
239b0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
239c0 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
239d0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
239e0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
239f0 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
23a00 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
23a10 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23a20 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
23a30 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
23a40 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
23a50 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
23a60 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
23a70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23a80 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
23a90 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
23aa0 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23ab0 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
23ac0 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
23ad0 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
23ae0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
23af0 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
23b00 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
23b10 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
23b20 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
23b30 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
23b40 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
23b50 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
23b60 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
23b70 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
23b80 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
23b90 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
23ba0 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
23bb0 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
23bc0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
23bd0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
23be0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
23bf0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23c00 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
23c10 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
23c20 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
23c30 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
23c40 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
23c50 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
23c60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
23c70 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
23c80 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
23c90 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
23ca0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
23cb0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
23cc0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
23cd0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
23ce0 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
23cf0 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
23d00 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
23d10 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
23d20 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
23d30 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
23d40 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
23d50 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
23d60 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
23d70 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
23d80 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
23d90 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
23da0 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
23db0 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
23dc0 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
23dd0 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
23de0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23df0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
23e00 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
23e10 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
23e20 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
23e30 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
23e40 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
23e50 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
23e60 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
23e70 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
23e80 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
23e90 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
23ea0 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
23eb0 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
23ec0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
23ed0 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
23ee0 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
23ef0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
23f00 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
23f10 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
23f20 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
23f30 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
23f40 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
23f50 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
23f60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23f70 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
23f80 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
23f90 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
23fa0 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
23fb0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
23fc0 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
23fd0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23fe0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
23ff0 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
24000 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
24010 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
24020 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
24030 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
24040 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
24050 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
24060 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
24070 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
24080 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
24090 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
240a0 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
240b0 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
240c0 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
240d0 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
240e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
240f0 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
24100 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
24110 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
24120 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
24130 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
24140 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
24150 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
24160 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
24170 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
24180 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
24190 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
241a0 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
241b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
241c0 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
241d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
241e0 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
241f0 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
24200 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
24210 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
24220 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
24230 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
24240 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
24250 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
24260 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
24270 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
24280 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
24290 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
242a0 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
242b0 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
242c0 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
242d0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
242e0 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
242f0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
24300 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
24310 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
24320 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
24330 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
24340 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
24350 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
24360 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
24370 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
24380 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
24390 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
243a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
243b0 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
243c0 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
243d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
243e0 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
243f0 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
24400 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
24410 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
24420 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
24430 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24450 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
24460 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
24470 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24490 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
244a0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
244b0 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
244c0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
244d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
244e0 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  EM;.    }..    i
244f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24500 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
24510 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
24520 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24530 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
24540 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
24550 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
24560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
24570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24580 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
24590 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
245a0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
245b0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
245c0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50  = pNew;.      pP
245d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
245e0 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
245f0 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
24600 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
24610 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
24620 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eSize;.    }else
24630 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
24640 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  ageFree(pNew);. 
24650 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61     }.  }..  *pPa
24660 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
24670 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
24680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24690 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  {.    if( nReser
246a0 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
246b0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
246c0 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
246d0 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
246e0 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
246f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
24700 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
24710 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
24720 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
24730 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d  );.    pagerFixM
24740 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
24750 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24770 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24780 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
24790 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
247a0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
247b0 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
247c0 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
247d0 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
247e0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
247f0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
24800 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
24810 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
24820 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
24830 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
24840 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
24850 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
24860 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
24870 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
24880 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
24890 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
248a0 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
248b0 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
248c0 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
248d0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
248e0 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
248f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24900 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
24910 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
24920 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
24930 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
24940 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
24950 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
24960 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
24970 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
24980 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
24990 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
249a0 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
249b0 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
249c0 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
249d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
249e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
249f0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
24a00 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
24a10 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
24a20 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
24a30 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
24a40 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
24a50 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
24a60 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
24a70 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
24a80 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24a90 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
24aa0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
24ab0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
24ac0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
24ad0 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
24ae0 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
24af0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
24b00 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
24b10 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
24b20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
24b30 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
24b40 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
24b50 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
24b60 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24b70 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
24b80 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
24b90 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
24ba0 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
24bb0 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
24bc0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
24bd0 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
24be0 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
24bf0 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
24c00 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
24c10 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
24c20 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
24c30 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
24c40 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
24c50 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
24c60 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
24c70 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
24c80 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
24c90 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24ca0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24cb0 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
24cc0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24cd0 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
24ce0 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
24cf0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
24d00 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
24d10 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
24d20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
24d30 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
24d40 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24d50 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
24d60 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
24d70 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
24d80 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
24d90 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24da0 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
24db0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
24dc0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
24dd0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
24de0 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
24df0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24e00 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
24e10 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
24e20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
24e30 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
24e40 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
24e50 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
24e60 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
24e70 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24e80 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
24e90 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
24ea0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
24eb0 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
24ec0 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
24ed0 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
24ee0 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
24ef0 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
24f00 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24f10 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
24f20 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
24f30 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
24f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
24f50 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
24f60 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
24f70 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
24f80 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
24f90 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
24fa0 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
24fb0 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
24fc0 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
24fd0 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
24fe0 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
24ff0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
25000 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
25010 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
25020 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
25030 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
25040 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
25050 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
25060 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
25070 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25080 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
25090 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
250a0 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
250b0 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
250c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
250d0 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
250e0 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
250f0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
25100 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
25110 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
25120 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
25130 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
25140 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
25150 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
25160 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
25170 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
25180 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
25190 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
251a0 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
251b0 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
251c0 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
251d0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
251e0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
251f0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
25200 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
25210 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
25220 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
25230 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
25240 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
25250 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
25260 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
25270 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
25280 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
25290 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
252a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
252b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
252c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
252d0 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
252e0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
252f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
25300 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
25310 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
25320 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
25330 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
25340 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
25350 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
25360 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
25370 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
25380 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
25390 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
253a0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
253b0 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
253c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
253d0 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
253e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
253f0 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
25400 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25410 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
25420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25430 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
25440 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
25450 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
25460 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
25470 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
25480 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
25490 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
254a0 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
254b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
254c0 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
254d0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
254e0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
254f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
25500 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
25510 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
25520 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
25530 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
25540 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
25550 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
25560 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
25570 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
25580 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
25590 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
255a0 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
255b0 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
255c0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
255d0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
255e0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
255f0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
25600 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
25610 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
25620 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
25630 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
25640 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
25650 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
25660 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
25670 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
25680 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
25690 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
256a0 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
256b0 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
256c0 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
256d0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
256e0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
256f0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
25700 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
25710 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25740 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
25750 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
25760 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
25770 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
25780 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
25790 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
257a0 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65  dy held), or one
257b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
257c0 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
257d0 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
257e0 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
257f0 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
25800 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
25810 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
25820 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
25830 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
25840 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
25850 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
25860 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
25870 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
25880 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
25890 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
258a0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
258b0 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
258c0 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
258d0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
258e0 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
258f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
25900 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
25910 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
25920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
25930 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
25940 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
25950 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
25960 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
25970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
25980 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
25990 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
259a0 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
259b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
259c0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
259d0 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
259e0 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
259f0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
25a00 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
25a10 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
25a20 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
25a30 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
25a40 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
25a50 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
25a60 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
25a70 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
25a80 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
25a90 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
25aa0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
25ab0 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
25ac0 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
25ad0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
25ae0 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
25af0 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
25b00 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
25b10 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
25b20 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
25b30 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
25b40 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
25b50 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
25b60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
25b70 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
25b80 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
25b90 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
25ba0 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
25bb0 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
25bc0 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
25bd0 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
25be0 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
25bf0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
25c00 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
25c10 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
25c20 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
25c30 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
25c40 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
25c50 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
25c60 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
25c70 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
25c80 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
25c90 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
25ca0 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
25cb0 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
25cc0 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
25cd0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
25ce0 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
25cf0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
25d00 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
25d10 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
25d20 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
25d30 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
25d40 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
25d50 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
25d60 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
25d70 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
25d80 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
25d90 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
25da0 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
25db0 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
25dc0 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
25dd0 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
25de0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
25df0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
25e00 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25e10 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25e20 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
25e30 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
25e40 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
25e50 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
25e60 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
25e70 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
25e80 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
25e90 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
25ea0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25eb0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25ec0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
25ed0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
25ee0 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
25ef0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
25f00 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25f10 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
25f20 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
25f30 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25f40 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
25f50 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
25f60 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
25f70 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
25f80 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
25f90 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
25fa0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
25fb0 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
25fc0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
25fd0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
25fe0 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
25ff0 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
26000 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
26010 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
26020 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
26030 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
26040 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
26050 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
26060 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
26070 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
26080 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74  nly called right
26090 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
260a0 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
260b0 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66  ..** Once this f
260c0 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
260d0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61   called, the tra
260e0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69  nsaction must ei
260f0 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65  ther be.** rolle
26100 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  d back or commit
26110 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73  ted. It is not s
26120 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  afe to call this
26130 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
26140 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77   then continue w
26150 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
26160 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  tabase..*/.void 
26170 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
26180 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
26190 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
261a0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
261b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
261c0 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
261d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
261e0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
261f0 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
26200 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
26210 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f  Page;..  /* At o
26220 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64  ne point the cod
26230 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73  e here called as
26240 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26250 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a  traint() to.  **
26260 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
26270 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75   pages being tru
26280 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74  ncated away by t
26290 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72  his operation ar
262a0 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f  e,.  ** if one o
262b0 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
262c0 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73  s are open, pres
262d0 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70  ent in the savep
262e0 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  oint .  ** journ
262f0 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  al so that they 
26300 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
26310 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  if the savepoint
26320 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
26330 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f  back. This is no
26340 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72   longer necessar
26350 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  y as this functi
26360 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20  on is now only. 
26370 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74   ** called right
26380 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
26390 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
263a0 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68  . So although th
263b0 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62  e .  ** Pager ob
263c0 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68  ject may still h
263d0 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ave open savepoi
263e0 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65  nts (Pager.nSave
263f0 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a  point!=0), .  **
26400 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
26410 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20  rolled back. So 
26420 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  the assertTrunca
26430 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63  teConstraint() c
26440 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c  all.  ** is no l
26450 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a  onger correct. *
26460 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
26470 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26480 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
26490 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
264a0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
264b0 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
264c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
264d0 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
264e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
264f0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
26500 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
26510 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
26520 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
26530 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
26540 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
26550 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
26560 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
26570 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
26580 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
26590 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
265a0 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
265b0 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
265c0 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
265d0 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
265e0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
265f0 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
26600 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
26610 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
26620 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
26630 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
26640 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
26650 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
26660 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
26670 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
26680 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
26690 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
266a0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
266b0 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
266c0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
266d0 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
266e0 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
266f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26700 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26710 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
26720 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
26730 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
26740 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
26750 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
26760 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
26770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26790 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
267a0 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
267b0 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
267c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
267d0 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
267e0 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
267f0 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26800 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
26810 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
26820 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
26830 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
26840 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
26850 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
26860 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
26870 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
26880 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
26890 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
268a0 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
268b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
268c0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
268d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
268e0 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
268f0 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
26900 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
26910 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
26920 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
26930 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
26940 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
26950 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
26960 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
26970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26980 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
26990 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
269a0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
269b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
269c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
269d0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
269e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
269f0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
26a00 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
26a30 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
26a40 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
26a50 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
26a60 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
26a70 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
26a80 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
26a90 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
26aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
26ab0 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26ac0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
26ad0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
26ae0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
26af0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
26b00 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
26b10 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
26b20 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26b30 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
26b40 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
26b50 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  0;.    memset(p-
26b60 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67  >pExtra, 0, pPag
26b70 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d  er->nExtra);.  }
26b80 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
26b90 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
26ba0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
26bb0 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
26bc0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
26bd0 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
26be0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26bf0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
26c00 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
26c10 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
26c20 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
26c30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26c40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
26c50 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
26c60 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
26c70 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
26c80 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
26c90 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
26ca0 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
26cb0 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
26cc0 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
26cd0 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
26ce0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
26cf0 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
26d00 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
26d10 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
26d20 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
26d30 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
26d40 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
26d50 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
26d60 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
26d70 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
26d80 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
26d90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26da0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  OK;.}../*.** Rel
26db0 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
26dc0 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50   to page pPg. pP
26dd0 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
26de0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
26df0 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  .** earlier call
26e00 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65   to pagerAcquire
26e10 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
26e20 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
26e30 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67  eleaseMapPage(Pg
26e40 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
26e50 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
26e60 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67  ->pPager;.  pPag
26e70 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a  er->nMmapOut--;.
26e80 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
26e90 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26ea0 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  elist;.  pPager-
26eb0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
26ec0 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28   pPg;..  assert(
26ed0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
26ee0 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
26ef0 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  =3 );.  sqlite3O
26f00 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
26f10 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e  >fd, (i64)(pPg->
26f20 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
26f30 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70  pageSize, pPg->p
26f40 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
26f50 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f  Free all PgHdr o
26f60 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e  bjects stored in
26f70 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70   the Pager.pMmap
26f80 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a  Freelist list..*
26f90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26fa0 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50  gerFreeMapHdrs(P
26fb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26fc0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48   PgHdr *p;.  PgH
26fd0 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  dr *pNext;.  for
26fe0 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  (p=pPager->pMmap
26ff0 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70  Freelist; p; p=p
27000 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
27010 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
27020 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27030 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
27040 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
27050 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
27060 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
27070 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
27080 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
27090 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
270a0 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
270b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
270c0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
270d0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
270e0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
270f0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
27100 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
27110 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
27120 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
27130 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
27140 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
27150 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
27160 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
27170 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
27180 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
27190 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
271a0 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
271b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
271c0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
271d0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
271e0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
271f0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
27200 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
27210 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
27220 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
27230 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
27240 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
27250 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
27260 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
27270 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
27280 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
27290 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
272a0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
272b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
272c0 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a  u8 *pTmp = (u8 *
272d0 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
272e0 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  ce;..  assert( a
272f0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
27300 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64  e(pPager) );.  d
27310 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
27320 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
27330 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
27340 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61  gnMalloc();.  pa
27350 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70  gerFreeMapHdrs(p
27360 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61  Pager);.  /* pPa
27370 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
27380 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
27390 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
273a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
273b0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69  _OMIT_WAL.  sqli
273c0 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
273d0 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
273e0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c  ->ckptSyncFlags,
273f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27400 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67  e, pTmp);.  pPag
27410 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
27420 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
27430 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
27440 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
27450 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
27460 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
27470 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
27480 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
27490 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
274a0 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
274b0 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
274c0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
274d0 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
274e0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
274f0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
27500 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
27510 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
27520 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
27530 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
27540 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
27550 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
27560 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
27570 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
27580 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
27590 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
275a0 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
275b0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
275c0 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
275d0 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
275e0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
275f0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
27600 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
27610 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
27620 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
27630 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
27640 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
27650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
27660 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
27670 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
27680 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
27690 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
276a0 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
276b0 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
276c0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
276d0 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
276e0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
276f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
27700 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
27710 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27720 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
27730 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
27740 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
27750 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
27760 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
27770 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
27780 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
27790 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
277a0 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
277b0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
277c0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
277d0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
277e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
277f0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
27800 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
27810 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
27820 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27830 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
27840 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
27850 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
27860 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
27870 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
27880 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
27890 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
278a0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
278b0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
278c0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
278d0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
278e0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
278f0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
27900 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
27910 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
27920 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
27930 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
27940 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
27950 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
27960 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
27970 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
27980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27990 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
279a0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
279b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
279c0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
279d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
279e0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
279f0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
27a00 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
27a10 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
27a20 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
27a30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
27a40 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
27a50 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
27a60 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
27a70 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
27a80 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
27a90 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
27aa0 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
27ab0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
27ac0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
27ad0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
27ae0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
27af0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
27b00 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27b10 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
27b20 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
27b30 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
27b40 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
27b50 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
27b60 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
27b70 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27b80 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
27b90 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
27ba0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
27bb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27bc0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
27bd0 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
27be0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
27bf0 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
27c00 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
27c10 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
27c20 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
27c30 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
27c40 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
27c50 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
27c60 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
27c70 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
27c80 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
27c90 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
27ca0 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
27cb0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
27cc0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
27cd0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
27ce0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
27cf0 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
27d00 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
27d10 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
27d20 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
27d30 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
27d40 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
27d50 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
27d60 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
27d70 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
27d80 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
27d90 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
27da0 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
27db0 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
27dc0 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
27dd0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
27de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27df0 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
27e00 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
27e10 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
27e20 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
27e30 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
27e40 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
27e50 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
27e60 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
27e70 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
27e80 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
27e90 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
27ea0 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
27eb0 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
27ec0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
27ed0 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
27ee0 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
27ef0 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
27f00 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
27f10 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
27f20 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
27f30 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
27f40 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
27f50 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
27f60 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
27f70 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
27f80 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
27f90 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
27fa0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
27fb0 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
27fc0 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
27fd0 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
27fe0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
27ff0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
28000 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
28010 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
28020 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
28030 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
28040 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
28050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
28060 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
28070 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
28080 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
280b0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
280c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
280d0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
280e0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
280f0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
28100 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
28110 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
28120 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
28130 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
28140 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
28150 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
28160 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
28170 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
28180 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 2c  siveLock(pPager,
28190 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
281a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
281b0 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  n rc;..  if( !pP
281c0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
281d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
281e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
281f0 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
28200 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
28210 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
28220 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
28230 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
28240 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
28250 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
28260 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
28270 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
28280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28290 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
282a0 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
282b0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
282c0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
282d0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
282e0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
282f0 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
28300 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
28310 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
28320 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
28330 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
28340 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
28350 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
28360 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
28370 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
28380 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
28390 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
283a0 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
283b0 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
283c0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
283d0 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
283e0 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
283f0 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
28400 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
28410 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
28420 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
28430 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
28440 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
28450 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
28460 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
28470 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
28480 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
28490 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
284a0 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
284b0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
284c0 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
284d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
284e0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
284f0 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
28500 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28510 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
28520 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
28530 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
28540 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
28550 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
28560 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
28570 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
28580 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
28590 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
285a0 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
285b0 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
285c0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
285d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
285e0 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
285f0 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
28600 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
28610 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
28620 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
28630 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
28640 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
28650 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28660 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
28670 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
28680 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
28690 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
286a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
286b0 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
286c0 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
286d0 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
286e0 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
286f0 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
28700 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
28710 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
28720 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
28730 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28740 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
28750 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
28760 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
28770 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
28780 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
28790 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
287a0 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
287b0 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
287c0 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
287d0 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
287e0 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
287f0 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
28800 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
28810 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
28820 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
28830 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
28840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
28850 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
28860 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
28870 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
28880 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
28890 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
288a0 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
288b0 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
288c0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
288d0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
288e0 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
288f0 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
28900 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
28910 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
28920 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
28930 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
28940 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
28950 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
28960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28970 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
28980 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
28990 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
289a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
289b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
289c0 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
289d0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
289e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
289f0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
28a00 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
28a10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28a20 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
28a30 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
28a40 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
28a50 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
28a60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28a70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
28a80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
28a90 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
28aa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28ab0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
28ac0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
28ad0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
28ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28af0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
28b00 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
28b10 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
28b20 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
28b30 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
28b40 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
28b50 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
28b60 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
28b70 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
28b80 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
28b90 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
28ba0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
28bb0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
28bc0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28bd0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
28be0 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
28bf0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
28c00 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
28c10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
28c20 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
28c30 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
28c40 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
28c50 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
28c60 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
28c70 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
28c80 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
28c90 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
28ca0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
28cb0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
28cc0 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
28cd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
28ce0 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
28cf0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
28d00 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
28d10 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
28d20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
28d30 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
28d40 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
28d50 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
28d60 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
28d70 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
28d80 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
28d90 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28da0 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
28db0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
28dc0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
28dd0 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
28de0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28df0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28e00 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
28e10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28e20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28e30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28e40 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
28e50 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
28e60 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
28e70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28e80 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
28e90 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
28ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
28eb0 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
28ec0 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
28ed0 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
28ee0 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
28ef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28f00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28f10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28f20 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
28f30 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28f40 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
28f50 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28f60 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
28f70 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
28f80 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
28f90 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28fa0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
28fb0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
28fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
28fd0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
28fe0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c  ager->syncFlags|
28ff0 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
29000 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
29010 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
29020 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
29030 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
29040 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
29050 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
29060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29070 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72   }..      pPager
29080 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
29090 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
290a0 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  f;.      if( new
290b0 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53  Hdr && 0==(iDc&S
290c0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
290d0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
290e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
290f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
29100 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
29110 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
29120 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29130 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
29140 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
29150 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
29160 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
29170 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29180 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
29190 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    /* Unless the 
291a0 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79  pager is in noSy
291b0 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
291c0 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
291d0 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  st .  ** success
291e0 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69  fully synced. Ei
291f0 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20  ther way, clear 
29200 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
29210 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a  YNC flag on .  *
29220 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a  * all pages..  *
29230 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
29240 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
29250 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
29260 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  ;.  pPager->eSta
29270 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
29280 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72  R_DBMOD;.  asser
29290 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
292a0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
292b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
292c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
292d0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
292e0 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
292f0 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
29300 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
29310 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
29320 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
29330 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
29340 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
29350 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
29360 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
29370 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
29380 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
29390 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
293a0 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
293b0 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
293c0 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
293d0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
293e0 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
293f0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
29400 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
29410 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
29420 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
29430 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
29440 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
29450 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
29460 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
29470 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
29480 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
29490 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
294a0 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
294b0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
294c0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
294d0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
294e0 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
294f0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
29500 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
29510 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
29520 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
29530 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
29540 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
29550 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
29560 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
29570 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
29580 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
29590 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
295a0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
295b0 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
295c0 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
295d0 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
295e0 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
295f0 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
29600 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
29610 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
29620 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
29630 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
29640 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
29650 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
29660 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
29670 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
29680 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
29690 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
296a0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
296b0 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
296c0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
296d0 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
296e0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
296f0 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
29700 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
29710 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
29720 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
29730 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
29740 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
29750 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
29760 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
29770 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
29780 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
29790 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
297a0 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
297b0 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
297c0 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
297d0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
297e0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
297f0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
29800 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29810 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
29820 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
29830 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
29840 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
29850 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
29860 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
29870 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
29880 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
29890 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
298a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
298b0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67  ite_pagelist(Pag
298c0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
298d0 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  r *pList){.  int
298e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
29910 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
29920 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
29930 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62  called for rollb
29940 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52  ack pagers in WR
29950 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65  ITER_DBMOD state
29960 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  . */.  assert( !
29970 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
29980 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
29990 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
299a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
299b0 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
299c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
299d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
299e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
299f0 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
29a00 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
29a10 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
29a20 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
29a30 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
29a40 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
29a50 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
29a60 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
29a70 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
29a80 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
29a90 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
29aa0 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
29ab0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
29ac0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
29ad0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
29ae0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
29af0 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
29b00 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
29b10 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
29b20 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
29b30 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
29b40 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  gs);.  }..  /* B
29b50 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
29b60 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20  write, give the 
29b70 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68  VFS a hint of wh
29b80 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a  at the final.  *
29b90 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c  * file size will
29ba0 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65   be..  */.  asse
29bb0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
29bc0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
29bd0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28  er->fd) );.  if(
29be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc==SQLITE_OK .
29bf0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
29c00 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d  HintSize<pPager-
29c10 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70  >dbSize.   && (p
29c20 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20  List->pDirty || 
29c30 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67  pList->pgno>pPag
29c40 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a  er->dbHintSize).
29c50 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
29c60 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
29c70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29c80 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
29c90 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
29ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
29cb0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
29cc0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
29cd0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
29ce0 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20  T, &szFile);.   
29cf0 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
29d00 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
29d10 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  Size;.  }..  whi
29d20 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
29d30 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
29d40 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c    Pgno pgno = pL
29d50 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20  ist->pgno;..    
29d60 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
29d70 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
29d80 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
29d90 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
29da0 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
29db0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
29dc0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
29dd0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
29de0 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c  eImage() was cal
29df0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
29e00 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
29e10 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
29e20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
29e30 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
29e40 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
29e50 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
29e60 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
29e70 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74   ** Also, do not
29e80 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70   write out any p
29e90 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65  age that has the
29ea0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
29eb0 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65  E flag.    ** se
29ec0 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65  t (set by sqlite
29ed0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
29ee0 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ))..    */.    i
29ef0 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
29f00 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
29f10 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
29f20 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
29f30 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
29f40 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
29f50 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
29f60 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ze;   /* Offset 
29f70 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  to write */.    
29f80 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20    char *pData;  
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fb0 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
29fc0 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20  e */    ..      
29fd0 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e  assert( (pList->
29fe0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
29ff0 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
2a000 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
2a010 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
2a020 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
2a030 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20  r(pList);..     
2a040 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
2a050 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
2a060 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2a070 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
2a080 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
2a090 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
2a0a0 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
2a0b0 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
2a0c0 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
2a0d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2a0e0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
2a0f0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
2a100 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
2a110 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
2a120 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
2a130 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
2a140 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
2a150 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
2a160 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
2a170 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
2a180 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
2a190 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
2a1a0 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
2a1b0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
2a1c0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
2a1d0 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
2a1e0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2a1f0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
2a200 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2a210 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2a220 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
2a230 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
2a240 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
2a250 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2a260 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
2a270 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
2a280 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
2a290 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
2a2a0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
2a2b0 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
2a2c0 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20  TAT_WRITE]++;.. 
2a2d0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
2a2e0 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
2a2f0 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
2a300 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
2a310 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
2a320 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
2a330 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
2a340 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
2a350 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
2a360 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2a370 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
2a380 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
2a390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a3a0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2a3b0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
2a3c0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
2a3d0 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
2a3e0 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
2a3f0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
2a400 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
2a410 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
2a420 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2a430 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
2a440 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2a450 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
2a460 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2a470 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
2a480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
2a490 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
2a4a0 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74  List);.    pList
2a4b0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2a4c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2a4d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73  rc;.}../*.** Ens
2a4e0 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62  ure that the sub
2a4f0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2a500 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20   open. If it is 
2a510 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
2a520 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
2a530 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
2a540 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2a550 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
2a560 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
2a570 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e  ding to plan. An
2a580 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
2a590 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
2a5a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2a5b0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
2a5c0 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61  3OsOpen() .** fa
2a5d0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2a5e0 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
2a5f0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
2a600 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a610 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69  ITE_OK;.  if( !i
2a620 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2a630 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
2a640 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2a650 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2a660 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
2a670 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
2a680 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
2a690 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
2a6a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2a6b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a6c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2a6d0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
2a6e0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
2a6f0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2a700 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
2a710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a720 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
2a730 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
2a740 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
2a750 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
2a760 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a  b-journal. .**.*
2a770 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2a780 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
2a790 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
2a7a0 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
2a7b0 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
2a7c0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
2a7d0 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
2a7e0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
2a7f0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2a800 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2a810 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2a820 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
2a830 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
2a840 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
2a850 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
2a860 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2a870 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a880 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2a890 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
2a8a0 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
2a8b0 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
2a8c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2a8d0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
2a8e0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
2a8f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a900 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2a910 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2a920 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2a930 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2a940 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2a950 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
2a960 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a970 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
2a980 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
2a990 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
2a9a0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2a9b0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
2a9c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2a9d0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2a9e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a9f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2aa00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2aa10 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2aa20 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2aa30 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2aa40 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2aa50 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2aa60 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2aa70 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2aa80 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2aa90 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2aaa0 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2aab0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2aac0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2aad0 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2aae0 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2aaf0 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2ab00 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2ab10 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2ab20 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2ab30 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2ab40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2ab50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ab60 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2ab70 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2ab80 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2ab90 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2aba0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2abb0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2abc0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2abd0 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
2abe0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2abf0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2ac00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2ac10 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2ac20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2ac30 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2ac40 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2ac50 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2ac60 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2ac70 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2ac80 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2ac90 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2aca0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2acb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2acc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2acd0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2ace0 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2acf0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2ad00 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2ad10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2ad20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ad30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2ad40 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2ad50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2ad60 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2ad70 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2ad80 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2ad90 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2ada0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2adb0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
2adc0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2add0 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a  Required(PgHdr *
2ade0 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a  pPg){.  if( subj
2adf0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2ae00 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2ae10 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2ae20 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
2ae30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ae40 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
2ae50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2ae60 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2ae70 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2ae80 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2ae90 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2aea0 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2aeb0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2aec0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2aed0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2aee0 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2aef0 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2af00 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2af10 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2af20 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2af30 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2af40 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2af50 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2af60 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2af70 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2af80 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2af90 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2afa0 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2afb0 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2afc0 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2afd0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2afe0 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2aff0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2b000 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2b010 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2b020 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2b030 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2b040 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2b050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b060 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2b070 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2b080 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2b090 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2b0a0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2b0b0 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2b0c0 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2b0d0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2b0e0 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2b0f0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2b100 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2b110 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2b120 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2b130 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2b140 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2b150 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2b160 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2b170 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2b180 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2b190 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2b1a0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2b1b0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2b1c0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2b1d0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2b1e0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2b1f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2b200 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2b210 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2b220 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2b230 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2b240 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b250 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2b260 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2b270 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2b280 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2b290 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2b2a0 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  /* The doNotSpil
2b2b0 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20  l NOSYNC bit is 
2b2c0 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
2b2d0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
2b2e0 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
2b2f0 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
2b300 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
2b310 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
2b320 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
2b330 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
2b340 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b350 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
2b360 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
2b370 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
2b380 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
2b390 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
2b3a0 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
2b3b0 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61  Spill ROLLBACK a
2b3c0 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69  nd OFF bits inhi
2b3d0 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2b3e0 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67  pilling.  ** reg
2b3f0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2b400 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  er or not a sync
2b410 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2b420 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2b430 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63  g.  ** a rollbac
2b440 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71  k or by user req
2b450 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65  uest, respective
2b460 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ly..  **.  ** Sp
2b470 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2b480 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2b490 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2b4a0 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2b4b0 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2b4c0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2b4d0 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2b4e0 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2b4f0 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ion it .  ** is 
2b500 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2b510 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2b520 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2b530 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2b540 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==3.  ** while i
2b550 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2b560 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2b570 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2b580 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2b590 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2b5a0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2b5b0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2b5c0 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2b5d0 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2b5e0 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2b5f0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2b600 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2b610 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2b620 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2b630 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2b640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b650 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2b660 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b670 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2b680 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2b690 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2b6a0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2b6b0 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2b6c0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2b6d0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2b6e0 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2b6f0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2b700 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2b710 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b720 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2b730 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2b740 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2b750 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2b760 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2b770 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2b780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b790 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2b7a0 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2b7b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2b7c0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  er) ){.    /* If
2b7d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2b7e0 20 69 73 20 61 20 22 42 45 47 49 4e 20 43 4f 4e   is a "BEGIN CON
2b7f0 43 55 52 52 45 4e 54 22 20 74 72 61 6e 73 61 63  CURRENT" transac
2b800 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 20 0a  tion, the page .
2b810 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65      ** cannot be
2b820 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b   flushed to disk
2b830 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69  . Return early i
2b840 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
2b850 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2b860 41 42 4c 45 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  ABLE_CONCURRENT.
2b870 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2b880 70 41 6c 6c 52 65 61 64 20 29 20 72 65 74 75 72  pAllRead ) retur
2b890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
2b8a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
2b8b0 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
2b8c0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
2b8d0 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
2b8e0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2b8f0 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
2b900 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72  pPg); .    if( r
2b910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b920 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b930 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
2b940 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  , pPg, 0, 0);.  
2b950 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a    }.  }else{.  .
2b960 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
2b970 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2b980 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
2b990 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
2b9a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2b9b0 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
2b9c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
2b9d0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
2b9e0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
2b9f0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2ba00 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ger, 1);.    }. 
2ba10 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
2ba20 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2ba30 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
2ba40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ba50 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
2ba60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ba70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
2ba80 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2ba90 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2baa0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2bab0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
2bac0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20  Pager, pPg);.   
2bad0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72   }.  }..  /* Mar
2bae0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
2baf0 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
2bb00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bb10 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2bb20 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
2bb30 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2bb40 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2bb50 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
2bb60 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
2bb70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
2bb80 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2bb90 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a  Pager, rc); .}..
2bba0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2bbb0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
2bbc0 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
2bbd0 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
2bbe0 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
2bbf0 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
2bc00 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
2bc10 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
2bc20 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
2bc30 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
2bc40 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
2bc50 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
2bc60 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
2bc70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2bc80 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
2bc90 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
2bca0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
2bcb0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
2bcc0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
2bcd0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
2bce0 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
2bcf0 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
2bd00 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
2bd10 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
2bd20 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
2bd30 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
2bd40 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
2bd50 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
2bd60 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
2bd70 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
2bd80 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
2bd90 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
2bda0 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
2bdb0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
2bdc0 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
2bdd0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
2bde0 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
2bdf0 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
2be00 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
2be10 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2be20 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
2be30 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
2be40 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
2be50 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
2be60 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
2be70 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
2be80 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2be90 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
2bea0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2beb0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2bec0 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2bed0 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2bee0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2bef0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2bf00 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2bf10 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2bf20 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2bf30 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2bf40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2bf50 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2bf60 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2bf70 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2bf80 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2bf90 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2bfa0 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2bfb0 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2bfc0 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2bfd0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2bfe0 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2bff0 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2c000 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2c010 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2c020 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2c030 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2c040 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2c050 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2c060 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2c070 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2c080 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2c090 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2c0a0 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2c0b0 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2c0c0 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2c0d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2c0e0 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2c0f0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2c100 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2c110 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2c120 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2c130 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2c140 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2c150 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2c160 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2c170 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2c180 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2c190 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2c1a0 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2c1b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2c1c0 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2c1d0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2c1e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c1f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2c200 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2c210 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2c220 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2c230 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2c240 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2c250 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2c260 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2c270 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2c280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2c290 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2c2a0 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2c2b0 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2c2c0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2c2d0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2c2e0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2c2f0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2c300 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2c310 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2c320 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2c330 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2c340 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2c350 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2c360 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2c370 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2c380 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2c390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c3a0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2c3b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2c3c0 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2c3d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2c3e0 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2c3f0 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2c400 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2c410 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2c420 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2c430 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2c440 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2c450 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2c460 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2c470 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2c480 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2c490 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2c4a0 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2c4b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2c4c0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2c4d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2c4e0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2c4f0 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2c500 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c510 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2c520 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2c530 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2c540 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2c550 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2c560 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2c570 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2c580 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2c590 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2c5a0 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2c5b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2c5c0 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2c5d0 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2c5e0 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2c5f0 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2c600 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2c610 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2c620 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2c630 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2c640 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2c650 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2c660 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2c670 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2c680 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2c690 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2c6a0 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2c6b0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2c6c0 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2c6d0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2c6e0 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2c6f0 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2c700 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2c710 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2c720 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2c730 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
2c740 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
2c750 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
2c760 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
2c770 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
2c780 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
2c790 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
2c7a0 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
2c7b0 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
2c7c0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
2c7d0 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
2c7e0 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
2c7f0 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
2c800 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
2c810 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
2c820 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
2c830 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
2c840 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2c850 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
2c860 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
2c870 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
2c880 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
2c890 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2c8a0 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
2c8b0 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
2c8c0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2c8d0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2c8e0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2c8f0 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
2c900 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2c910 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2c920 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2c930 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
2c940 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
2c950 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
2c960 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
2c970 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
2c980 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23  *ppPager = 0;..#
2c990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c9a0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
2c9b0 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ( flags & PAGER_
2c9c0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65  MEMORY ){.    me
2c9d0 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mDb = 1;.    if(
2c9e0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2c9f0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2ca00 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2ca10 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2ca20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  0, zFilename);. 
2ca30 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61       if( zPathna
2ca40 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20  me==0  ) return 
2ca50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2ca60 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2ca70 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2ca80 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2ca90 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2caa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2cab0 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2cac0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2cad0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2cae0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2caf0 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2cb00 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2cb10 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2cb20 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2cb30 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2cb40 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2cb50 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2cb60 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2cb70 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2cb80 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2cb90 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2cba0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2cbb0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2cbc0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2cbd0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2cbe0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
2cbf0 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68  llocRaw(0, nPath
2cc00 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
2cc10 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
2cc20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2cc30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2cc40 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b  }.    zPathname[
2cc50 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
2cc60 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
2cc70 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
2cc80 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
2cc90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2cca0 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
2ccb0 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
2ccc0 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
2ccd0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74  hname);.    nPat
2cce0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2ccf0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2cd00 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69  e);.    z = zUri
2cd10 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71   = &zFilename[sq
2cd20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
2cd30 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20  ilename)+1];.   
2cd40 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
2cd50 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2cd60 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2cd70 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2cd80 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2cd90 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d      }.    nUri =
2cda0 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a   (int)(&z[1] - z
2cdb0 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Uri);.    assert
2cdc0 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20  ( nUri>=0 );.   
2cdd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cde0 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
2cdf0 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
2ce00 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
2ce10 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2ce20 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
2ce30 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
2ce40 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
2ce50 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
2ce60 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
2ce70 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
2ce80 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
2ce90 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
2cea0 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
2ceb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
2cec0 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
2ced0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
2cee0 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
2cef0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
2cf00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2cf10 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
2cf20 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
2cf30 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
2cf40 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
2cf50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2cf60 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2cf70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2cf80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2cf90 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2cfa0 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2cfb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2cfc0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2cfd0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2cfe0 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2cff0 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2d000 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2d010 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2d020 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2d030 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2d040 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2d050 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2d060 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2d070 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2d080 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2d090 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2d0a0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2d0b0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2d0c0 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2d0d0 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2d0e0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2d0f0 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2d100 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2d110 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2d120 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2d130 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2d140 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2d150 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2d160 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2d170 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2d180 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2d190 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2d1a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2d1b0 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2d1c0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2d1d0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2d1e0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2d1f0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2d200 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2d210 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2d220 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2d230 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2d240 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2d250 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2d260 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2d270 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2d280 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2d290 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2d2a0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2d2b0 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2d2c0 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2d2d0 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2d2e0 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2d2f0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2d300 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2d310 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2d320 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2d330 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2d340 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2d350 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2d360 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2d370 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2d380 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2d390 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2d3a0 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20   + 8 + 2        
2d3b0 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2d3c0 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2d3d0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2d3e0 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2d3f0 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2d400 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
2d410 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
2d420 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2d430 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
2d440 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
2d450 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
2d460 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
2d470 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d480 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2d490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2d4a0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
2d4b0 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2d4c0 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2d4d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2d4e0 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2d4f0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d500 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2d510 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2d520 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2d530 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2d540 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2d550 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2d560 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2d570 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d580 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2d590 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2d5a0 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2d5b0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2d5c0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2d5d0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2d5e0 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2d5f0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2d600 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2d610 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2d620 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2d630 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2d640 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2d650 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2d660 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2d670 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2d680 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2d690 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2d6a0 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2d6b0 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2d6c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2d6d0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2d6e0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d6f0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2d700 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d710 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2d720 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2d730 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2d740 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2d750 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2d760 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2d770 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2d780 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2d790 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d7a0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2d7b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2d7c0 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2d7d0 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2d7e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2d7f0 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2d800 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2d810 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2d820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d830 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2d840 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2d850 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2d860 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2d870 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2d880 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2d890 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d8a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2d8b0 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2d8c0 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2d8d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d8e0 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d8f0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d900 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2d910 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2d920 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2d930 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2d940 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2d950 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2d960 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2d970 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2d980 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2d990 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2d9a0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2d9b0 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2d9c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d9d0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2d9e0 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2d9f0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2da00 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2da10 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2da20 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2da30 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2da40 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2da50 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2da60 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2da70 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2da80 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2da90 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2daa0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2dab0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2dac0 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2dad0 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2dae0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2daf0 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2db00 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2db10 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2db20 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2db30 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2db40 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2db50 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2db60 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2db70 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2db80 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2db90 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2dba0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2dbb0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2dbc0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2dbd0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2dbe0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2dbf0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2dc00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dc10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63  ){.      int iDc
2dc20 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2dc30 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2dc40 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2dc50 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e       if( !readOn
2dc60 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ly ){.        se
2dc70 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2dc80 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
2dc90 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2dca0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2dcb0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2dcc0 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2dcd0 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2dce0 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2dcf0 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2dd00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2dd10 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
2dd20 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2dd30 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
2dd40 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2dd50 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2dd60 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dd70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2dd80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2dd90 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2dda0 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2ddb0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
2ddc0 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
2ddd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2dde0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2ddf0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2de00 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
2de10 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2de20 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2de30 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2de40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2de50 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2de60 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2de70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2de80 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2de90 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dea0 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2deb0 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2dec0 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2ded0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2dee0 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2def0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2df00 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2df10 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2df20 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2df30 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2df40 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2df50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2df60 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2df70 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
2df80 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2df90 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2dfa0 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2dfb0 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20  "nolock", 0);.  
2dfc0 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53      if( (iDc & S
2dfd0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55  QLITE_IOCAP_IMMU
2dfe0 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20  TABLE)!=0.      
2dff0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   || sqlite3_uri_
2e000 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2e010 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20  e, "immutable", 
2e020 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
2e030 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  vfsFlags |= SQLI
2e040 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2e050 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2e060 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66   act_like_temp_f
2e070 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
2e080 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2e090 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2e0a0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2e0b0 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2e0c0 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2e0d0 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2e0e0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2e0f0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2e100 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2e110 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2e120 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2e130 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2e140 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2e150 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2e160 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2e170 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2e180 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2e190 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2e1a0 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2e1b0 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2e1c0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2e1d0 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2e1e0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2e1f0 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2e200 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2e210 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2e220 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2e230 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75  s branch also ru
2e240 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72  ns for files mar
2e250 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65  ked as immutable
2e260 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69  ..    */ .act_li
2e270 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20  ke_temp_file:.  
2e280 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2e290 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2e2a0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2e2b0 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  R;     /* Preten
2e2c0 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  d we already hav
2e2d0 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  e a lock */.    
2e2e0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2e2f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20  EXCLUSIVE_LOCK; 
2e300 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2e310 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56   are in EXCLUSIV
2e320 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50  E mode */.    pP
2e330 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31  ager->noLock = 1
2e340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e350 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e   /* Do no lockin
2e360 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c  g */.    readOnl
2e370 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2e380 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e390 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2e3a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2e3b0 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2e3c0 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2e3d0 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2e3e0 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2e3f0 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2e400 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2e410 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2e420 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2e430 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e440 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e450 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2e460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e470 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2e480 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2e490 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2e4a0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2e4b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2e4c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2e4d0 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2e4e0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2e4f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e500 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
2e510 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74 72  000 );.    nExtr
2e520 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
2e530 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  a);.    rc = sql
2e540 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
2e550 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
2e560 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e580 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2e590 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2e5a0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2e5b0 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20  pPCache);.  }.. 
2e5c0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2e5d0 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20  occurred above, 
2e5e0 66 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20  free the  Pager 
2e5f0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
2e600 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
2e610 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
2e620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2e630 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2e640 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
2e650 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
2e660 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
2e670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2e680 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2e690 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2e6a0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
2e6b0 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
2e6c0 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
2e6d0 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
2e6e0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
2e6f0 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
2e700 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
2e710 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e720 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
2e730 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
2e740 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a  useJournal;.  /*
2e750 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
2e760 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
2e770 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
2e780 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e790 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
2e7a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e7b0 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
2e7c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e7d0 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
2e7e0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
2e7f0 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
2e800 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
2e810 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
2e820 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
2e830 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2e840 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
2e850 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
2e860 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e870 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
2e880 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
2e890 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
2e8a0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2e8b0 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
2e8c0 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
2e8d0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e8e0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2e8f0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2e900 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2e910 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
2e920 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2e930 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
2e940 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
2e950 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2e960 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e970 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
2e980 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
2e990 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2e9a0 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
2e9b0 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  ;.  assert( useJ
2e9c0 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
2e9d0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2e9e0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
2e9f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ea00 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
2ea10 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
2ea20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
2ea30 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  ullSync==0 );.  
2ea40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ea50 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ->syncFlags==0 )
2ea60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2ea70 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2ea80 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2ea90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70  ert( pPager->ckp
2eaa0 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  tSyncFlags==0 );
2eab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
2eac0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
2ead0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2eae0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
2eaf0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2eb00 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
2eb10 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2eb20 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
2eb30 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
2eb40 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65  TIONS;.    pPage
2eb50 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2eb60 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2eb70 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
2eb80 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2eb90 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2eba0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2ebb0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ebc0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2ebd0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2ebe0 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2ebf0 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2ec00 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2ec10 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ec20 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2ec30 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2ec40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2ec50 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
2ec60 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2ec70 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
2ec80 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2ec90 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2eca0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2ecb0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
2ecc0 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
2ecd0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2ece0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2ecf0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ed00 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
2ed10 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
2ed20 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
2ed30 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
2ed40 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
2ed50 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
2ed60 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
2ed70 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
2ed80 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
2ed90 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2eda0 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Hash)); */.  /* 
2edb0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
2edc0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2edd0 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c  MMAP_SIZE // wil
2ede0 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65  l be set by btre
2edf0 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  e.c */..  *ppPag
2ee00 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
2ee10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ee20 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
2ee30 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2ee40 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
2ee50 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61   deleted or rena
2ee60 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  med out from.** 
2ee70 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e  under the pager.
2ee80 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2ee90 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61  OK if the databa
2eea0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65  se is still were
2eeb0 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20   it ought.** to 
2eec0 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74  be on disk.  Ret
2eed0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51  urn non-zero (SQ
2eee0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2eef0 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74  MOVED or some ot
2ef00 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  her error.** cod
2ef10 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73  e from sqlite3Os
2ef20 41 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65  Access()) if the
2ef30 20 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f   database has go
2ef40 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73  ne missing..*/.s
2ef50 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61  tatic int databa
2ef60 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65  seIsUnmoved(Page
2ef70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2ef80 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b  t bHasMoved = 0;
2ef90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2efa0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2efb0 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
2efc0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
2efd0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29  ger->dbSize==0 )
2efe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2eff0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
2f000 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26  ger->zFilename &
2f010 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  & pPager->zFilen
2f020 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d  ame[0] );.  rc =
2f030 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
2f040 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
2f050 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48  , SQLITE_FCNTL_H
2f060 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d  AS_MOVED, &bHasM
2f070 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  oved);.  if( rc=
2f080 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
2f090 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2f0a0 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65  e HAS_MOVED file
2f0b0 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d  -control is unim
2f0c0 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d  plemented, assum
2f0d0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a  e that the file.
2f0e0 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
2f0f0 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74  een moved.  That
2f100 20 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63   is the historic
2f110 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53  al behavior of S
2f120 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a  QLite: prior to.
2f130 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
2f140 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63  .8.3, it never c
2f150 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63  hecked */.    rc
2f160 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f170 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2f180 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d  LITE_OK && bHasM
2f190 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  oved ){.    rc =
2f1a0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2f1b0 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20  _DBMOVED;.  }.  
2f1c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2f1d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2f1e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2f1f0 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2f200 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2f210 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2f220 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2f230 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2f240 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2f250 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2f260 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2f270 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2f280 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2f290 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2f2a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2f2b0 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2f2c0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2f2d0 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2f2e0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2f2f0 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2f300 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2f310 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2f320 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2f330 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2f340 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2f350 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2f360 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2f370 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2f380 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2f390 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2f3a0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2f3b0 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2f3c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2f3d0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2f3e0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2f3f0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2f400 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2f410 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2f420 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2f430 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2f440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f450 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2f460 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2f470 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2f480 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2f490 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2f4a0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2f4b0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2f4c0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2f4d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2f4e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2f4f0 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2f500 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2f510 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2f520 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2f530 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2f540 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2f550 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2f560 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2f570 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2f580 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2f590 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2f5a0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2f5b0 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2f5c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2f5d0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2f5e0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2f5f0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2f600 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2f610 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2f620 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2f630 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2f640 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2f650 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2f660 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2f670 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2f680 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2f690 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2f6a0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2f6b0 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2f6c0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2f6d0 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2f6e0 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2f6f0 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2f700 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2f710 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2f720 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f730 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2f740 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2f750 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2f760 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2f770 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2f780 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2f790 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2f7a0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2f7b0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2f7c0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
2f7d0 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
2f7e0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2f7f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
2f800 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
2f810 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2f820 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
2f830 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2f840 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
2f850 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2f860 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2f870 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
2f880 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2f890 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2f8a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2f8b0 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
2f8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f8d0 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
2f8e0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
2f8f0 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
2f900 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
2f910 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
2f920 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2f930 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2f940 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2f950 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
2f960 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2f970 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2f980 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
2f990 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
2f9a0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2f9b0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2f9c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
2f9d0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
2f9e0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
2f9f0 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
2fa00 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
2fa10 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2fa20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2fa30 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
2fa40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2fa50 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2fa60 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
2fa70 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2fa80 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
2fa90 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
2faa0 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
2fab0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2fac0 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
2fad0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2fae0 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
2faf0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
2fb00 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
2fb10 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
2fb20 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
2fb30 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
2fb40 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
2fb50 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
2fb60 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
2fb70 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
2fb80 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
2fb90 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
2fba0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
2fbb0 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
2fbc0 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
2fbd0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2fbe0 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
2fbf0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
2fc00 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
2fc10 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
2fc20 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
2fc30 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
2fc40 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2fc50 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
2fc60 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
2fc70 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
2fc80 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
2fc90 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
2fca0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
2fcb0 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
2fcc0 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
2fcd0 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
2fce0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2fcf0 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2fd00 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
2fd10 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
2fd20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fd30 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
2fd40 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2fd50 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2fd60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2fd70 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2fd80 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2fd90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
2fda0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
2fdb0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
2fdc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fdd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2fde0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2fdf0 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20  s zero pages in 
2fe00 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  size, that means
2fe10 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29   that either (1)
2fe20 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2fe30 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d  journal is a rem
2fe40 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f  nant from a prio
2fe50 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  r database with 
2fe60 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68  the same name wh
2fe70 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ere.        ** t
2fe80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fe90 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75   but not the jou
2fea0 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64  rnal was deleted
2feb0 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69  , or (2) the ini
2fec0 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  tial.        ** 
2fed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
2fee0 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77   populates a new
2fef0 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69   database is bei
2ff00 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ng rolled back..
2ff10 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69          ** In ei
2ff20 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a  ther case, the j
2ff30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20  ournal file can 
2ff40 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77  be deleted.  How
2ff50 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a  ever, take care.
2ff60 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74          ** not t
2ff70 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
2ff80 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
2ff90 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
2ffa0 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  due to.        *
2ffb0 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  * journal_mode=P
2ffc0 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20  ERSIST..        
2ffd0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  */.        if( n
2ffe0 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c  Page==0 && !jrnl
2fff0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
30000 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
30010 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
30020 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
30030 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
30040 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
30050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30060 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30070 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
30080 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
30090 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
300a0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
300b0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
300c0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
300d0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
300e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
300f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
30100 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
30110 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
30120 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
30130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
30140 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
30150 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
30160 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
30170 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
30180 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
30190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
301a0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
301b0 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
301c0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
301d0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
301e0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
301f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30200 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
30210 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
30220 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
30230 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
30240 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
30250 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
30260 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
30270 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
30280 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
30290 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
302a0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
302b0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
302c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
302d0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
302e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
302f0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
30300 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
30310 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
30320 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
30330 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
30340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30350 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
30360 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
30370 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30380 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
30390 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
303a0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
303b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
303c0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
303d0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
303e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
303f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
30400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30410 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
30420 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
30430 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
30440 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
30450 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30460 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
30470 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
30480 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
30490 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
304a0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
304b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
304c0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
304d0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
304e0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
304f0 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
30500 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
30510 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
30520 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
30530 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
30540 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
30550 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
30560 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
30570 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
30580 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
30590 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
305a0 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
305b0 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
305c0 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
305d0 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
305e0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
305f0 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
30600 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
30610 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
30620 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
30630 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
30640 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
30650 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
30660 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
30670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
30680 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
30690 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
306a0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
306b0 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
306c0 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
306d0 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
306e0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
306f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30700 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
30710 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30740 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30750 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
30760 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
30770 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30780 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
30790 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
307a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
307b0 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
307c0 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
307d0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29  e3PagerAcquire()
307e0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
307f0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
30800 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
30810 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
30820 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
30830 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
30840 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
30850 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
30860 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
30870 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
30880 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
30890 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
308a0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
308b0 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
308c0 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
308d0 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f  ently in PAGER_O
308e0 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  PEN state (no lo
308f0 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
30900 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30910 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
30920 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
30930 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
30940 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
30950 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30960 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
30970 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
30980 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
30990 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
309a0 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
309b0 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
309c0 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
309d0 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
309e0 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
309f0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
30a00 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
30a10 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
30a20 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30a30 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
30a40 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
30a50 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
30a60 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
30a70 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
30a80 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
30a90 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
30aa0 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
30ab0 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
30ac0 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
30ad0 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
30ae0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
30af0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
30b00 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
30b10 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
30b20 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
30b30 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
30b40 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
30b50 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
30b60 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
30b70 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
30b80 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
30b90 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
30ba0 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
30bb0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
30bc0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
30bd0 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
30be0 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
30bf0 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
30c00 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
30c10 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
30c20 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
30c30 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
30c40 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
30c50 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
30c60 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
30c70 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
30c80 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  t-journal file o
30c90 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61  r .** rolling ba
30ca0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
30cb0 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
30cc0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30cd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30ce0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
30cf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
30d00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30d10 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
30d20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30d30 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
30d40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
30d50 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
30d60 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
30d70 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
30d80 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
30d90 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70   pages. This imp
30da0 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61  lies that the pa
30db0 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64  ger state should
30dc0 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20   either.  ** be 
30dd0 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20  OPEN or READER. 
30de0 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70  READER is only p
30df0 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70  ossible if the p
30e00 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69  ager is or was i
30e10 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76  n .  ** exclusiv
30e20 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20  e access mode.. 
30e30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
30e40 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
30e50 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
30e60 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  che)==0 );.  ass
30e70 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
30e80 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
30e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30ea0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30eb0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
30ec0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
30ed0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28  _READER );.  if(
30ee0 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
30ef0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
30f00 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
30f10 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
30f20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
30f30 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
30f40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30f50 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
30f60 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
30f70 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
30f80 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
30f90 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
30fa0 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
30fb0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
30fc0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
30fd0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
30fe0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
30ff0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
31000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31010 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31020 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
31030 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
31040 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
31050 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
31060 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
31070 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
31080 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
31090 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
310a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
310b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
310c0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
310d0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
310e0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
310f0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
31100 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
31110 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
31120 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
31130 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
31140 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
31150 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
31160 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31180 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31190 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
311a0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
311b0 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
311c0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
311d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
311e0 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
311f0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
31200 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
31210 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
31220 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
31230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31240 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
31250 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
31260 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
31270 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
31280 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
31290 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
312a0 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
312b0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
312c0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
312d0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
312e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
312f0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
31300 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
31310 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
31320 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
31330 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
31340 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
31350 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
31360 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
31370 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
31380 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
31390 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
313a0 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
313b0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
313c0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
313d0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
313e0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
313f0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
31400 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
31410 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31420 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
31430 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
31440 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
31450 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
31460 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
31470 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
31480 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31490 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
314a0 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
314b0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
314c0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
314d0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
314e0 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
314f0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
31500 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
31510 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
31520 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
31530 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
31540 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
31550 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
31560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31580 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31590 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
315a0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
315b0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
315c0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
315d0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
315e0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
315f0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
31600 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
31610 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
31620 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
31630 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
31640 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
31650 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
31660 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
31670 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
31680 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
31690 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
316a0 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
316b0 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
316c0 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
316d0 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
316e0 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
316f0 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
31700 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
31710 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
31720 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
31730 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
31740 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
31750 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
31760 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
31770 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
31780 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
31790 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
317a0 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
317b0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
317c0 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
317d0 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
317e0 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
317f0 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
31800 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
31810 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
31820 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
31830 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
31840 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
31850 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
31860 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
31870 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
31880 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
31890 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
318a0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
318b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
318c0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
318d0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
318e0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
318f0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
31900 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
31910 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
31920 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31930 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
31940 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
31950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31960 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
31970 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
31980 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31990 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
319a0 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
319b0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
319c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
319d0 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
319e0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
319f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
31a00 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
31a10 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
31a20 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31a30 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
31a40 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
31a50 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
31a60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31a70 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
31a80 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31a90 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
31aa0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
31ab0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
31ac0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
31ad0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31ae0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
31af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31b00 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
31b10 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
31b20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31b30 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
31b40 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
31b50 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
31b60 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
31b70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31b80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
31b90 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
31ba0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
31bb0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
31bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
31bd0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
31be0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
31bf0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
31c00 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
31c10 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
31c20 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
31c30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
31c40 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
31c50 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
31c60 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
31c70 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
31c80 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
31c90 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
31ca0 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
31cb0 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
31cc0 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
31cd0 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
31ce0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
31cf0 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
31d00 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
31d10 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
31d20 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
31d30 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
31d40 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
31d50 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
31d60 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
31d70 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31d80 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31d90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31da0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31db0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
31dc0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
31dd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31df0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
31e00 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
31e10 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
31e20 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
31e30 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
31e40 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
31e50 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
31e60 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
31e70 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
31e80 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
31e90 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
31ea0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
31eb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31ec0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
31ed0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
31ee0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
31ef0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
31f00 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
31f10 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
31f20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
31f30 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
31f40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
31f50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
31f60 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
31f70 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
31f80 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
31f90 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
31fa0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
31fb0 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
31fc0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
31fd0 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
31fe0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
31ff0 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
32000 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
32010 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
32020 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
32030 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
32040 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
32050 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
32060 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
32070 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
32080 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
32090 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
320a0 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
320b0 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
320c0 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
320d0 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
320e0 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
320f0 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
32100 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
32110 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
32120 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
32130 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
32140 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
32150 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
32160 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
32170 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
32180 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
32190 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
321a0 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
321b0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
321c0 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
321d0 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
321e0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
321f0 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
32200 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
32210 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
32220 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
32230 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
32240 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
32250 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
32260 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
32270 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
32280 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
32290 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
322a0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
322b0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
322c0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
322d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
322e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
322f0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
32300 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
32310 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
32320 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
32330 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
32340 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
32350 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
32360 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
32370 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
32380 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
32390 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68  ile && pPager->h
323a0 61 73 42 65 65 6e 55 73 65 64 20 29 7b 0a 20 20  asBeenUsed ){.  
323b0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
323c0 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
323d0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 74 68  been acquired th
323e0 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20  en check to.    
323f0 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20    ** see if the 
32400 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
32410 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
32420 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
32430 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20   changed,.      
32440 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  ** flush the cac
32450 68 65 2e 20 20 54 68 65 20 70 50 61 67 65 72 2d  he.  The pPager-
32460 3e 68 61 73 42 65 65 6e 55 73 65 64 20 66 6c 61  >hasBeenUsed fla
32470 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20  g prevents this 
32480 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63  from.      ** oc
32490 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76  curring on the v
324a0 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73  ery first access
324b0 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f   to a file, in o
324c0 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20  rder to save a. 
324d0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75       ** single u
324e0 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74  nnecessary sqlit
324f0 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20  e3OsRead() call 
32500 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e  at the start-up.
32510 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
32520 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
32530 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ges are detected
32540 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
32550 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
32560 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
32570 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
32580 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
32590 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
325a0 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
325b0 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
325c0 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
325d0 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
325e0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
325f0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
32600 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
32610 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
32620 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
32630 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
32640 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
32650 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
32660 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
32670 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
32680 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
32690 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
326a0 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
326b0 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
326c0 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
326d0 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
326e0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
326f0 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
32700 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
32710 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
32720 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
32730 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
32740 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
32750 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  s)];..      rc =
32760 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
32770 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
32780 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
32790 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20  goto failed;..  
327a0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20      if( nPage>0 
327b0 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
327c0 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
327d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
327e0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
327f0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
32800 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
32810 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
32820 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
32830 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
32840 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
32850 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
32860 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
32870 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
32880 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
32890 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
328a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
328b0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
328c0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
328d0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
328e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
328f0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
32900 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
32910 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
32920 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
32930 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
32940 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  reset(pPager);..
32950 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70          /* Unmap
32960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32970 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62  le. It is possib
32980 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c  le that external
32990 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20   processes.     
329a0 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74     ** may have t
329b0 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74  runcated the dat
329c0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
329d0 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20  hen extended it 
329e0 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  back.        ** 
329f0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
32a00 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20  size while this 
32a10 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20  process was not 
32a20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a  holding a lock..
32a30 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
32a40 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61  is case there ma
32a50 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e  y exist a Pager.
32a60 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61  pMap mapping tha
32a70 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20  t appears.      
32a80 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72    ** to be the r
32a90 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73  ight size but is
32aa0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61   not actually va
32ab0 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a  lid. Avoid this.
32ac0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
32ad0 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70  bility by unmapp
32ae0 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e  ing the db here.
32af0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
32b00 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
32b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
32b20 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
32b30 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
32b40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32b50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
32b60 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
32b70 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
32b80 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
32b90 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
32ba0 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
32bb0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
32bc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
32bd0 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
32be0 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
32bf0 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
32c00 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
32c10 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ger);.#ifndef SQ
32c20 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
32c30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32c40 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
32c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
32c60 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
32c70 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
32c80 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
32c90 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
32ca0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
32cb0 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
32cc0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
32cd0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
32ce0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32cf0 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
32d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
32d10 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
32d20 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
32d30 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
32d40 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
32d50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32d60 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
32d70 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
32d80 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
32d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
32da0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32db0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
32dc0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
32dd0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
32de0 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  EADER;.  }.  ret
32df0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
32e00 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
32e10 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
32e20 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
32e30 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
32e40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
32e50 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
32e60 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
32e70 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
32e80 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
32e90 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
32ea0 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
32eb0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
32ec0 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
32ed0 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
32ee0 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
32ef0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
32f00 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
32f10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
32f20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
32f30 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
32f40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32f50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
32f60 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73  MmapOut==0 && (s
32f70 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
32f80 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
32f90 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20  ache)==0) ){.   
32fa0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
32fb0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
32fc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  .  }.}../*.** Ac
32fd0 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
32fe0 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  e to page number
32ff0 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70   pgno in pager p
33000 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a  Pager (a page.**
33010 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74   reference has t
33020 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66  ype DbPage*). If
33030 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
33040 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20  eference is .** 
33050 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
33060 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70  ained, it is cop
33070 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61  ied to *ppPage a
33080 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
33090 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
330a0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
330b0 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
330c0 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69   the cache, it i
330d0 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
330e0 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77  Otherwise, a new
330f0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20   page object is 
33100 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
33110 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74  pulated with dat
33120 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74  a.** read from t
33130 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33140 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c  . In some cases,
33150 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75   the pcache modu
33160 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65  le may.** choose
33170 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65   not to allocate
33180 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
33190 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65  ct and may reuse
331a0 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
331b0 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f  object with no o
331c0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
331d0 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ences..**.** The
331e0 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
331f0 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
33200 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
33210 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68  ized to zeros th
33220 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65  e .** first time
33230 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
33240 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49  d into memory. I
33250 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65  f the page reque
33260 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65  sted is .** alre
33270 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
33280 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
33290 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
332a0 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a  hen the extra.**
332b0 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73   data is left as
332c0 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65   it was when the
332d0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73   page object was
332e0 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a   last used..**.*
332f0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
33300 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c  e image is small
33310 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
33320 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66  ested page or if
33330 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20   a .** non-zero 
33340 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20  value is passed 
33350 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  as the noContent
33360 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74   parameter and t
33370 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
33380 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
33390 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74  eady stored in t
333a0 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e  he cache, then n
333b0 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73  o .** actual dis
333c0 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49  k read occurs. I
333d0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
333e0 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
333f0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20  the .** page is 
33400 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
33410 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a  ll zeros. .**.**
33420 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
33430 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
33440 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
33450 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f  are about the co
33460 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
33470 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
33480 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  rs in two scenar
33490 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
334a0 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
334b0 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
334c0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
334d0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
334e0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
334f0 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
33500 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
33510 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
33520 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
33530 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
33540 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
33550 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
33560 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
33570 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
33580 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
33590 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
335a0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
335b0 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
335c0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
335d0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
335e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
335f0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
33600 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
33610 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
33620 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
33630 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
33640 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
33650 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
33660 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
33670 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
33680 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
33690 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
336a0 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
336b0 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
336c0 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
336d0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
336e0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
336f0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
33700 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
33710 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33720 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
33730 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
33740 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
33750 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
33760 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
33770 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
33780 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
33790 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
337a0 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
337b0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
337c0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
337d0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
337e0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
337f0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
33800 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
33810 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
33820 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
33830 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
33840 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
33850 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
33860 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
33870 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
33880 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
33890 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
338a0 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
338b0 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
338c0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
338d0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
338e0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
338f0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
33900 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
33910 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
33920 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
33930 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
33940 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
33950 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
33960 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
33970 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
33980 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
33990 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
339a0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
339b0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
339c0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
339d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
339e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
339f0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
33a00 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
33a10 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
33a20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
33a30 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
33a40 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
33a50 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
33a60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
33a70 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
33a80 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
33a90 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
33aa0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
33ab0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33ac0 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
33ad0 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69  pPg = 0;.  u32 i
33ae0 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
33af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
33b00 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ame to read from
33b10 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63   WAL file */.  c
33b20 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  onst int noConte
33b30 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  nt = (flags & PA
33b40 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
33b50 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  T);..  /* It is 
33b60 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73  acceptable to us
33b70 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d  e a read-only (m
33b80 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e  map) page for an
33b90 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20  y page except.  
33ba0 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65  ** page 1 if the
33bb0 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  re is no write-t
33bc0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
33bd0 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52  or the ACQUIRE_R
33be0 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61  EADONLY.  ** fla
33bf0 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20  g was specified 
33c00 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41  by the caller. A
33c10 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68  nd so long as th
33c20 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20  e db is not a . 
33c30 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72   ** temporary or
33c40 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
33c50 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ase.  */.  const
33c60 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28   int bMmapOk = (
33c70 70 67 6e 6f 21 3d 31 20 26 26 20 55 53 45 46 45  pgno!=1 && USEFE
33c80 54 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 26  TCH(pPager).   &
33c90 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
33ca0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
33cb0 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45  || (flags & PAGE
33cc0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29  R_GET_READONLY))
33cd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
33ce0 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70  AS_CODEC.   && p
33cf0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
33d00 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20  .#endif.  );..  
33d10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33d20 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
33d30 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
33d40 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
33d50 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
33d60 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74    assert( noCont
33d70 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f  ent==0 || bMmapO
33d80 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  k==0 );..  if( p
33d90 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
33da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
33db0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
33dc0 70 50 61 67 65 72 2d 3e 68 61 73 42 65 65 6e 55  pPager->hasBeenU
33dd0 73 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  sed = 1;..  /* I
33de0 66 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f 4e  f this is an CON
33df0 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74  CURRENT transact
33e00 69 6f 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  ion and the page
33e10 20 62 65 69 6e 67 20 72 65 61 64 20 77 61 73 0a   being read was.
33e20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20    ** present in 
33e30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33e40 65 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  e when the trans
33e50 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
33e60 64 2c 0a 20 20 2a 2a 20 6d 61 72 6b 20 69 74 20  d,.  ** mark it 
33e70 61 73 20 72 65 61 64 20 69 6e 20 74 68 65 20 70  as read in the p
33e80 41 6c 6c 52 65 61 64 20 76 65 63 74 6f 72 2e 20  AllRead vector. 
33e90 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
33ea0 45 5f 45 4e 41 42 4c 45 5f 43 4f 4e 43 55 52 52  E_ENABLE_CONCURR
33eb0 45 4e 54 0a 20 20 69 66 28 20 70 50 61 67 65 72  ENT.  if( pPager
33ec0 2d 3e 70 41 6c 6c 52 65 61 64 20 26 26 20 70 67  ->pAllRead && pg
33ed0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
33ee0 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 63  igSize ){.    rc
33ef0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
33f00 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Set(pPager->pAll
33f10 52 65 61 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  Read, pgno);.   
33f20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33f30 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
33f40 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
33f50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
33f60 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
33f70 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
33f80 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
33f90 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
33fa0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
33fb0 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
33fc0 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
33fd0 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
33fe0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33ff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34000 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
34010 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
34020 7b 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f  {.    if( bMmapO
34030 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  k && pagerUseWal
34040 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
34050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
34060 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
34070 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
34080 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
34090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
340a0 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
340b0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
340c0 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f  ..    if( bMmapO
340d0 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29  k && iFrame==0 )
340e0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
340f0 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ata = 0;..      
34100 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65  rc = sqlite3OsFe
34110 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
34120 0a 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29  .          (i64)
34130 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
34140 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
34150 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
34160 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a  pData.      );..
34170 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
34180 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
34190 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
341a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
341b0 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20  AGER_READER ){. 
341c0 20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73           pPg = s
341d0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
341e0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
341f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34200 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
34210 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
34220 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
34230 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  age(pPager, pgno
34240 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a  , pData, &pPg);.
34250 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
34260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
34270 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
34280 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
34290 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
342a0 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
342b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
342c0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
342d0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
342e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
342f0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
34300 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20  = pPg;.         
34310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34320 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
34330 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
34340 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34350 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
34360 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
34380 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
34390 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
343a0 70 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61  pBase;.      pBa
343b0 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
343c0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
343d0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
343e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 61  );.      if( pBa
343f0 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
34400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
34410 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70  cheFetchStress(p
34420 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34430 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20  pgno, &pBase);. 
34440 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
34450 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
34460 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34470 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
34480 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Base==0 ){.     
34490 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61       pPg = *ppPa
344a0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
344b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
344c0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  MEM;.          g
344d0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
344e0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d  e_err;.        }
344f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
34500 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73  Pg = *ppPage = s
34510 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34520 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
34530 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
34540 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Base);.      ass
34550 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20  ert( pPg!=0 );. 
34560 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
34570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34580 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
34590 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
345a0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
345b0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
345c0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
345d0 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
345e0 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
345f0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
34600 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
34610 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
34620 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
34630 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
34640 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
34650 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
34660 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34670 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
34680 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50  sert( pPg==(*ppP
34690 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
346a0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  ( pPg->pgno==pgn
346b0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
346c0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
346d0 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  er || pPg->pPage
346e0 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  r==0 );..  if( p
346f0 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  Pg->pPager && !n
34700 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
34710 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
34720 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
34730 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
34740 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
34750 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
34760 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
34770 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
34780 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34790 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
347a0 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
347b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
347c0 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
347d0 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
347e0 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20  TAT_HIT]++;.    
347f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34800 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
34810 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
34820 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
34830 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
34840 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
34850 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
34860 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20  alized.  */..   
34870 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
34880 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
34890 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
348a0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
348b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
348c0 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
348d0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
348e0 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
348f0 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
34900 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
34910 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
34920 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
34930 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
34940 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
34950 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
34960 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
34970 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
34980 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34990 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
349a0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
349b0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
349c0 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
349d0 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  nt || !isOpen(pP
349e0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
349f0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
34a00 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
34a10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34a20 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
34a30 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34a40 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
34a50 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
34a60 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
34a70 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
34a80 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
34a90 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
34aa0 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
34ab0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
34ac0 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
34ad0 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
34ae0 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
34af0 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
34b00 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
34b10 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
34b20 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
34b30 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
34b40 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
34b50 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
34b60 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
34b70 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
34b80 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
34b90 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
34ba0 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
34bb0 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
34bc0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
34bd0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
34be0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
34bf0 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
34c00 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
34c10 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
34c20 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
34c30 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
34c40 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
34c50 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
34c60 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
34c70 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
34c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
34c90 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
34ca0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
34cb0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
34cc0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
34cd0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
34ce0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
34cf0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
34d00 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
34d10 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
34d20 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
34d30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34d40 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
34d50 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
34d60 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
34d70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34d80 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
34d90 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 62  Wal(pPager) && b
34da0 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20  MmapOk==0 ){.   
34db0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34dc0 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
34dd0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
34de0 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
34df0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34e00 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
34e10 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
34e30 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
34e40 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
34e50 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
34e60 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53  [PAGER_STAT_MISS
34e70 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ]++;.      rc = 
34e80 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20  readDbPage(pPg, 
34e90 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
34ea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
34ec0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34ed0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34ee0 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
34ef0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
34f00 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
34f10 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
34f20 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
34f30 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
34f40 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
34f50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
34f60 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
34f70 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
34f80 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
34f90 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
34fa0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
34fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
34fc0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
34fd0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
34fe0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
34ff0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
35000 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
35010 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
35020 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
35030 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
35040 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
35050 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20  n cache. .**.** 
35060 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
35070 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
35080 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
35090 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
350a0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
350b0 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
350c0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
350d0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
350e0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
350f0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
35100 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
35110 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
35120 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
35130 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
35140 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
35150 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
35160 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
35170 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
35180 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
35190 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
351a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
351b0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c  gno pgno){.  sql
351c0 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
351d0 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
351e0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
351f0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
35200 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
35210 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
35220 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73  0 );.  pPage = s
35230 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
35240 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
35250 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61  e, pgno, 0);.  a
35260 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20  ssert( pPage==0 
35270 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 42 65  || pPager->hasBe
35280 65 6e 55 73 65 64 20 29 3b 0a 20 20 69 66 28 20  enUsed );.  if( 
35290 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  pPage==0 ) retur
352a0 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  n 0;.  return sq
352b0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
352c0 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
352d0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50  PCache, pgno, pP
352e0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  age);.}../*.** R
352f0 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
35300 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
35310 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
35320 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
35330 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
35340 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
35350 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
35360 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
35370 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
35380 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
35390 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
353a0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
353b0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
353c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
353d0 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
353e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
353f0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
35400 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  l(DbPage *pPg){.
35410 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
35420 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d  .  assert( pPg!=
35430 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  0 );.  pPager = 
35440 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
35450 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  f( pPg->flags & 
35460 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20  PGHDR_MMAP ){.  
35470 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61    pagerReleaseMa
35480 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  pPage(pPg);.  }e
35490 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
354a0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
354b0 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
354c0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
354d0 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  ager);.}.void sq
354e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
354f0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
35500 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65  if( pPg ) sqlite
35510 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
35520 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll(pPg);.}../*.*
35530 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
35540 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
35550 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
35560 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
35570 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
35580 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
35590 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
355a0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
355b0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
355c0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
355d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
355e0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
355f0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
35600 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
35610 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
35620 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
35630 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
35640 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
35650 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
35660 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
35670 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
35680 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35690 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
356a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
356b0 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
356c0 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
356d0 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
356e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
356f0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
35700 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
35710 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
35720 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
35730 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
35740 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
35750 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
35760 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
35770 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
35780 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
35790 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
357a0 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
357b0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
357c0 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
357d0 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
357e0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
357f0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
35800 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
35810 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
35820 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
35830 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
35840 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
35850 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
35860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
35870 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
35880 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
35890 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
358a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
358b0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
358c0 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
358d0 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
358e0 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
358f0 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
35900 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
35910 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
35920 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
35930 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
35940 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
35950 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
35960 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
35970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35980 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
35990 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
359a0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
359b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
359c0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
359d0 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
359e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
359f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35a00 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
35a10 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
35a20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
35a30 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
35a40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35a50 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
35a60 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
35a70 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
35a80 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
35a90 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
35aa0 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
35ab0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
35ac0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
35ad0 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
35ae0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
35af0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
35b00 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
35b10 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
35b20 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
35b30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
35b40 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
35b50 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
35b60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
35b70 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
35b80 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
35b90 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35ba0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
35bb0 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
35bc0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
35bd0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
35be0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
35bf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35c00 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a  NOMEM;.    }.  .
35c10 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
35c20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
35c30 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
35c40 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69  y open. */.    i
35c50 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
35c60 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
35c70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
35c80 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
35c90 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
35ca0 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  RY ){.        sq
35cb0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
35cc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
35cd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35ce0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
35cf0 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
35d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
35d10 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
35d20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
35d30 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
35d40 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
35d50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
35d60 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70  TE|.          (p
35d70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
35d80 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ? .            (
35d90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
35da0 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
35db0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
35dc0 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  AL):.           
35dd0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
35de0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
35df0 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
35e00 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
35e10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
35e20 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65  ill has the same
35e30 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20   name as it did 
35e40 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  when.        ** 
35e50 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  it was originall
35e60 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20  y opened. */.   
35e70 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61       rc = databa
35e80 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67  seIsUnmoved(pPag
35e90 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
35ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35eb0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
35ec0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
35ed0 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 72 63  ITE.          rc
35ee0 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
35ef0 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20  lOpen(.         
35f00 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
35f10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
35f20 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
35f30 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
35f40 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20  pPager).        
35f50 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
35f60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35f70 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
35f80 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
35f90 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
35fa0 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  gs, 0);.#endif. 
35fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
35fd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
35fe0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
35ff0 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  fd) );.    }.  .
36000 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
36010 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
36020 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
36030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
36040 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   open .    ** th
36050 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
36060 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
36070 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
36080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36090 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
360a0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
360b0 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
360c0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ired. */.      p
360d0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
360e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
360f0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
36100 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
36110 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
36120 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
36130 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lHdr = 0;.      
36140 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
36150 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
36160 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
36170 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36180 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
36190 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
361a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
361b0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
361c0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rnal = 0;.  }els
361d0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
361e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
361f0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
36200 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ED );.    pPager
36210 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
36220 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
36230 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
36240 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
36250 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
36260 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
36270 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
36280 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
36290 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
362a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
362b0 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
362c0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
362d0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
362e0 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
362f0 20 69 73 20 30 2c 20 74 68 65 6e 20 61 63 71 75   is 0, then acqu
36300 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
36310 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
36320 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36330 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
36340 69 73 20 3e 30 2c 20 74 68 65 6e 20 61 63 71 75  is >0, then acqu
36350 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
36360 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
36370 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
36380 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
36390 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
363a0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
363b0 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
363c0 2a 20 49 66 20 28 65 78 46 6c 61 67 3c 30 29 20  * If (exFlag<0) 
363d0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
363e0 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
363f0 20 64 6f 20 6e 6f 74 20 74 61 6b 65 20 61 6e 79   do not take any
36400 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 54 68 65 20 74   locks..** The t
36410 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
36420 72 75 6e 20 69 6e 20 43 4f 4e 43 55 52 52 45 4e  run in CONCURREN
36430 54 20 6d 6f 64 65 20 69 6e 73 74 65 61 64 2e 0a  T mode instead..
36440 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
36450 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
36460 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
36470 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
36480 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
36490 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
364a0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
364b0 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
364c0 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
364d0 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
364e0 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
364f0 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
36500 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
36510 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
36520 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
36530 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
36540 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
36550 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
36560 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
36570 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
36580 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
36590 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
365a0 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
365b0 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
365c0 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
365d0 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
365e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
365f0 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
36600 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
36610 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
36620 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
36630 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
36640 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
36650 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
36660 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
36670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
36680 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
36690 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
366a0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
366b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
366c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
366d0 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
366e0 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
366f0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
36700 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
36710 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
36720 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
36730 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36740 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){.  
36750 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36760 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
36770 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  );.    if( pager
36780 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
36790 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
367a0 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
367b0 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
367c0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
367d0 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
367e0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
367f0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
36800 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
36810 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
36820 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
36830 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
36840 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
36850 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
36860 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
36870 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
36880 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
36890 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
368a0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
368b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
368c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
368d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
368e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
368f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
36900 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
36910 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
36920 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
36930 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
36940 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
36950 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
36960 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
36970 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
36980 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
36990 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
369a0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
369b0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
369c0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
369d0 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
369e0 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
369f0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
36a00 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
36a10 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
36a20 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
36a30 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
36a40 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
36a50 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 65    */.      if( e
36a60 78 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  xFlag>=0 ){.    
36a70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36a80 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
36a90 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
36aa0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  >pWal);.      }.
36ab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36ac0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
36ad0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
36ae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
36af0 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
36b00 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
36b10 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
36b20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
36b30 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
36b40 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
36b50 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
36b60 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
36b70 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
36b80 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
36b90 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
36ba0 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
36bb0 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
36bc0 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
36bd0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
36be0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36bf0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
36c00 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
36c10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36c20 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67  ITE_OK && exFlag
36c30 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  >0 ){.        rc
36c40 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
36c50 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
36c60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
36c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
36c80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36c90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
36ca0 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52  Change to WRITER
36cb0 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20  _LOCKED state.. 
36cc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
36cd0 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50   WAL mode sets P
36ce0 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50  ager.eState to P
36cf0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
36d00 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20  ED or CACHEMOD. 
36d10 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20       ** when it 
36d20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  has an open tran
36d30 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
36d40 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46  er to DBMOD or F
36d50 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a  INISHED..      *
36d60 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
36d70 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65  e in those state
36d80 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  s the code to ro
36d90 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  ll back savepoin
36da0 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
36db0 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70  sactions may cop
36dc0 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  y data from the 
36dd0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f  sub-journal into
36de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
36df0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
36e00 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65  well as into the
36e10 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
36e20 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
36e30 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20  rrect in .      
36e40 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20  ** WAL mode..   
36e50 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
36e60 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
36e70 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36e80 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36e90 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
36ea0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
36eb0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
36ec0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
36ed0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
36ee0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
36ef0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
36f00 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
36f10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
36f20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
36f30 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
36f40 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
36f50 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
36f60 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
36f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
36f80 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36f90 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
36fa0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73  OCKED );.    ass
36fb0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
36fc0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
36fd0 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
36fe0 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
36ff0 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
37000 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72  D(pPager)));.  r
37010 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37020 2a 2a 20 57 72 69 74 65 20 70 61 67 65 20 70 50  ** Write page pP
37030 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  g onto the end o
37040 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
37050 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
37060 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
37070 45 20 69 6e 74 20 70 61 67 65 72 41 64 64 50 61  E int pagerAddPa
37080 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72  geToRollbackJour
37090 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
370a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
370b0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
370c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
370d0 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72 20 2a 70  cksum;.  char *p
370e0 44 61 74 61 32 3b 0a 20 20 69 36 34 20 69 4f 66  Data2;.  i64 iOf
370f0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
37100 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 65  nalOff;..  /* We
37110 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
37120 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
37130 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
37140 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 74 61   that.  ** conta
37150 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
37160 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
37170 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
37180 72 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 61 74  rifies.  ** that
37190 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
371a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
371b0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
371c0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  O(pPager) );..  
371d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
371e0 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67  journalHdr<=pPag
371f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
37200 3b 0a 20 20 43 4f 44 45 43 32 28 70 50 61 67 65  ;.  CODEC2(pPage
37210 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
37220 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
37230 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
37240 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 63 6b 73  , pData2);.  cks
37250 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
37260 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
37270 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  ata2);..  /* Eve
37280 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
37290 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
372a0 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  urs while journa
372b0 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 70  lling the.  ** p
372c0 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  age in the block
372d0 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20   above, set the 
372e0 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66  need-sync flag f
372f0 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  or the page..  *
37300 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
37310 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
37320 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
37330 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
37340 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
37350 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
37360 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
37370 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
37380 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  tored.  ** in th
37390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
373a0 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72   And if an IO er
373b0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
373c0 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a 20   doing so,.  ** 
373d0 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
373e0 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f  may follow..  */
373f0 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d  .  pPg->flags |=
37400 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
37410 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
37420 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
37430 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67  d, iOff, pPg->pg
37440 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
37450 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
37460 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
37470 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
37480 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
37490 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
374a0 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 69 66  e, iOff+4);.  if
374b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
374c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
374d0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
374e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
374f0 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f+pPager->pageSi
37500 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  ze+4, cksum);.  
37510 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37520 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
37530 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
37540 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
37550 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
37560 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
37570 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
37580 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
37590 67 65 53 69 7a 65 29 29 3b 0a 20 20 50 41 47 45  geSize));.  PAGE
375a0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
375b0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
375c0 74 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  t);.  PAGERTRACE
375d0 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
375e0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
375f0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
37600 0a 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28  .       PAGERID(
37610 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
37620 6e 6f 2c 20 0a 20 20 20 20 20 20 20 28 28 70 50  no, .       ((pP
37630 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
37640 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20  EED_SYNC)?1:0), 
37650 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
37660 50 67 29 29 29 3b 0a 0a 20 20 70 50 61 67 65 72  Pg)));..  pPager
37670 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
37680 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  8 + pPager->page
37690 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
376a0 6e 52 65 63 2b 2b 3b 0a 20 20 61 73 73 65 72 74  nRec++;.  assert
376b0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
376c0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 72 63 20  rnal!=0 );.  rc 
376d0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
376e0 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
376f0 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
37700 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 72  );.  testcase( r
37710 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
37720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
37730 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
37740 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
37750 3b 0a 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53  ;.  rc |= addToS
37760 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
37770 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
37780 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  o);.  assert( rc
37790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
377a0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
377b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
377c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
377d0 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
377e0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
377f0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
37800 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
37810 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
37820 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
37830 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
37840 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
37850 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
37860 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
37870 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
37880 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
37890 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
378a0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
378b0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
378c0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
378d0 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
378e0 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
378f0 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
37900 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
37910 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
37920 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
37930 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
37940 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
37950 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
37960 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
37970 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
37980 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74  unless a write-t
37990 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
379a0 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65  lready .  ** bee
379b0 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a  n started. The j
379c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
379d0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
379e0 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  en at this point
379f0 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76  ..  ** It is nev
37a00 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  er called in the
37a10 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20   ERROR state..  
37a20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
37a30 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37a40 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37a50 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
37a60 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37a70 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
37a80 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
37a90 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37aa0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
37ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
37ac0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
37ad0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
37ae0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
37af0 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Code==0 );.  ass
37b00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61  ert( pPager->rea
37b10 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 43 48  dOnly==0 );.  CH
37b20 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
37b30 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
37b40 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
37b50 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72  e opened. Higher
37b60 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
37b70 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
37b80 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e  * obtained the n
37b90 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74  ecessary locks t
37ba0 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 74  o begin the writ
37bb0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  e-transaction, b
37bc0 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c  ut the.  ** roll
37bd0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  back journal mig
37be0 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70  ht not yet be op
37bf0 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20  en. Open it now 
37c00 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  if this is the c
37c10 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ase..  **.  ** T
37c20 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
37c30 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  re calling sqlit
37c40 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
37c50 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  y() on the page.
37c60 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
37c70 2c 20 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e  , if it were don
37c80 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20  e after calling 
37c90 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
37ca0 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20  eDirty(), then. 
37cb0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67   ** an error mig
37cc0 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65  ht occur and the
37cd0 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64   pager would end
37ce0 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f   up in WRITER_LO
37cf0 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20  CKED state.  ** 
37d00 77 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65  with pages marke
37d10 64 20 61 73 20 64 69 72 74 79 20 69 6e 20 74 68  d as dirty in th
37d20 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  e cache..  */.  
37d30 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
37d40 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37d50 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72  _LOCKED ){.    r
37d60 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
37d70 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
37d80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37d90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
37da0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
37db0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
37dc0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
37dd0 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  CHEMOD );.  asse
37de0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
37df0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
37e00 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
37e10 20 70 61 67 65 20 74 68 61 74 20 69 73 20 61 62   page that is ab
37e20 6f 75 74 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  out to be modifi
37e30 65 64 20 61 73 20 64 69 72 74 79 2e 20 2a 2f 0a  ed as dirty. */.
37e40 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
37e50 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 0a  akeDirty(pPg);..
37e60 20 20 2f 2a 20 49 66 20 61 20 72 6f 6c 6c 62 61    /* If a rollba
37e70 63 6b 20 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6e  ck journal is in
37e80 20 75 73 65 2c 20 74 68 65 6d 20 6d 61 6b 65 20   use, them make 
37e90 73 75 72 65 20 74 68 65 20 70 61 67 65 20 74 68  sure the page th
37ea0 61 74 20 69 73 20 61 62 6f 75 74 0a 20 20 2a 2a  at is about.  **
37eb0 20 74 6f 20 63 68 61 6e 67 65 20 69 73 20 69 6e   to change is in
37ec0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
37ed0 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 74 68 65  urnal, or if the
37ee0 20 70 61 67 65 20 69 73 20 61 20 6e 65 77 20 70   page is a new p
37ef0 61 67 65 20 6f 66 66 0a 20 20 2a 2a 20 74 68 65  age off.  ** the
37f00 6e 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  n end of the fil
37f10 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  e, make sure it 
37f20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 50 47 48  is marked as PGH
37f30 44 52 5f 4e 45 45 44 5f 53 59 4e 43 2e 0a 20 20  DR_NEED_SYNC..  
37f40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
37f50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37f60 21 3d 30 29 20 3d 3d 20 69 73 4f 70 65 6e 28 70  !=0) == isOpen(p
37f70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
37f80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
37f90 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20 20 20 26 26  Journal!=0.   &&
37fa0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
37fb0 73 74 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 72  stNotNull(pPager
37fc0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
37fd0 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a 20 20 29 7b  g->pgno)==0.  ){
37fe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
37ff0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
38000 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
38010 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
38020 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
38030 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
38040 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63  AddPageToRollbac
38050 6b 4a 6f 75 72 6e 61 6c 28 70 50 67 29 3b 0a 20  kJournal(pPg);. 
38060 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
38070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
38080 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
38090 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
380a0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
380b0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
380c0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a  WRITER_DBMOD ){.
380d0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
380e0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
380f0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20  _SYNC;.      }. 
38100 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
38110 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
38120 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
38130 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
38140 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
38150 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
38160 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
38170 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
38180 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
38190 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
381a0 20 54 68 65 20 50 47 48 44 52 5f 44 49 52 54 59   The PGHDR_DIRTY
381b0 20 62 69 74 20 69 73 20 73 65 74 20 61 62 6f 76   bit is set abov
381c0 65 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  e when the page 
381d0 77 61 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  was added to the
381e0 20 64 69 72 74 79 2d 6c 69 73 74 0a 20 20 2a 2a   dirty-list.  **
381f0 20 61 6e 64 20 62 65 66 6f 72 65 20 77 72 69 74   and before writ
38200 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74  ing the page int
38210 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  o the rollback j
38220 6f 75 72 6e 61 6c 2e 20 20 57 61 69 74 20 75 6e  ournal.  Wait un
38230 74 69 6c 20 6e 6f 77 2c 0a 20 20 2a 2a 20 61 66  til now,.  ** af
38240 74 65 72 20 74 68 65 20 70 61 67 65 20 68 61 73  ter the page has
38250 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
38260 6c 79 20 6a 6f 75 72 6e 61 6c 6c 65 64 2c 20 62  ly journalled, b
38270 65 66 6f 72 65 20 73 65 74 74 69 6e 67 20 74 68  efore setting th
38280 65 0a 20 20 2a 2a 20 50 47 48 44 52 5f 57 52 49  e.  ** PGHDR_WRI
38290 54 45 41 42 4c 45 20 62 69 74 20 74 68 61 74 20  TEABLE bit that 
382a0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
382b0 68 65 20 70 61 67 65 20 63 61 6e 20 62 65 20 73  he page can be s
382c0 61 66 65 6c 79 20 6d 6f 64 69 66 69 65 64 2e 0a  afely modified..
382d0 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67    */.  pPg->flag
382e0 73 20 7c 3d 20 50 47 48 44 52 5f 57 52 49 54 45  s |= PGHDR_WRITE
382f0 41 42 4c 45 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  ABLE;.  .  /* If
38300 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
38310 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
38320 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
38330 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74  ot in it,.  ** t
38340 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 61  hen write the pa
38350 67 65 20 69 6e 74 6f 20 74 68 65 20 73 74 61 74  ge into the stat
38360 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
38370 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
38380 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
38390 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  {.    rc = subjo
383a0 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
383b0 72 65 64 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  red(pPg);.  }.. 
383c0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
383d0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
383e0 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 69 66   return. */.  if
383f0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
38400 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  <pPg->pgno ){.  
38410 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
38420 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
38430 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
38440 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
38450 61 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c  a variant of sql
38460 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
38470 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20   that runs when 
38480 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  the sector size.
38490 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
384a0 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  n the page size.
384b0 20 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 74    SQLite makes t
384c0 68 65 20 28 72 65 61 73 6f 6e 61 62 6c 65 29 20  he (reasonable) 
384d0 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 0a  assumption that.
384e0 2a 2a 20 61 6c 6c 20 62 79 74 65 73 20 6f 66 20  ** all bytes of 
384f0 61 20 73 65 63 74 6f 72 20 61 72 65 20 77 72 69  a sector are wri
38500 74 74 65 6e 20 74 6f 67 65 74 68 65 72 20 62 79  tten together by
38510 20 68 61 72 64 77 61 72 65 2e 20 20 48 65 6e 63   hardware.  Henc
38520 65 2c 20 61 6c 6c 20 62 79 74 65 73 20 6f 66 0a  e, all bytes of.
38530 2a 2a 20 61 20 73 65 63 74 6f 72 20 6e 65 65 64  ** a sector need
38540 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65   to be journalle
38550 64 20 69 6e 20 63 61 73 65 20 6f 66 20 61 20 70  d in case of a p
38560 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20 74 68 65  ower loss in the
38570 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 20   middle of.** a 
38580 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75  write..**.** Usu
38590 61 6c 6c 79 2c 20 74 68 65 20 73 65 63 74 6f 72  ally, the sector
385a0 20 73 69 7a 65 20 69 73 20 6c 65 73 73 20 74 68   size is less th
385b0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
385c0 68 65 20 70 61 67 65 20 73 69 7a 65 2c 20 69 6e  he page size, in
385d0 20 77 68 69 63 68 0a 2a 2a 20 63 61 73 65 20 70   which.** case p
385e0 61 67 65 73 20 63 61 6e 20 62 65 20 69 6e 64 69  ages can be indi
385f0 76 69 64 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  vidually written
38600 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
38610 6f 6e 6c 79 20 72 75 6e 73 20 69 6e 20 74 68 65  only runs in the
38620 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c 20  .** exceptional 
38630 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 70  case where the p
38640 61 67 65 20 73 69 7a 65 20 69 73 20 73 6d 61 6c  age size is smal
38650 6c 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ler than the sec
38660 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  tor size..*/.sta
38670 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
38680 49 4e 45 20 69 6e 74 20 70 61 67 65 72 57 72 69  INE int pagerWri
38690 74 65 4c 61 72 67 65 53 65 63 74 6f 72 28 50 67  teLargeSector(Pg
386a0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
386b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
386c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
386d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67  urn code */.  Pg
386e0 6e 6f 20